🐈

[Rails] next if が使えないときの逃げ方

2023/01/18に公開
2

はじめに - next if について

railsのループ処理中に「こいつには処理を適用しなくていいな」というやつがあると、 next if で飛ばすことができます。

numbers = [1,2,3,4,5,6,7,8,9,10]
numbers.each do |num|
  next if num.even?
  p num
end

上記のコードだと以下の出力が得られるはずだ

1
3
5
7
9

しかし、業務中に next if を使うとうまいこと欲しい結果を得ることができない事象が発生しました。
その際に教えていただいた方法を残しておきます。
どのような状況でも使えるわけではないかと思うので、参考程度に読んでいただけると幸いです。

本題 - next if からの逃げ方

というわけで、早速回避方法を記載していきます。

追記: こちらコメントでいただいたご指摘を踏まえて修正しましたmm

numbers = [1,2,3,4,5,6,7,8,9,10]
odd_numbers = numbers.select(&:odd?)
odd_numbers.each do |num|
  p num
end

出力は最初に書いたコードと同じになります。
要は、 next if で避けるものを、ループ処理の実行前に省いてしまおう ということです。

反省

言われるとめちゃくちゃシンプルで納得感があり、
ループ処理中に配列の一部を省くようなこともしないのでこちらの方が可読性が高い気がします。
next if で対処することに執着しすぎていました〜泣

参考

next ifに関してはこちらの記事が簡潔にわかりやすく説明してくださっています。
https://qiita.com/shizen-shin/items/5dde6ab742e3cd666c78

コメントで教えていただいた&:メソッド名についてはこちらの記事が簡潔でわかりやすいかったです。
https://qiita.com/s_tatsuki/items/869af9c0c33d9d650f3f

完全に余談ですが、&:メソッド名の方がブロックを渡すより速いらしいです。
https://techracho.bpsinc.jp/hachi8833/2022_08_10/77566

Discussion

Junichi ItoJunichi Ito

こうのさん、こんにちは。

「ループ処理の実行前に省いてしまおう」とのことですが、このコードだと何かを省いたというより、単に奇数だけの配列をベタ書きしただけのように見えます。

odd_numbers = [1,3,5,7,9]

おそらくですが、教えてもらった方法は次のように、numbersを操作して奇数だけの配列を得る方法ではないでしょうか?

numbers = [1,2,3,4,5,6,7,8,9,10]
odd_numbers = numbers.select(&:odd?)
#=> [1, 3, 5, 7, 9]
あやつきあやつき

コメントありがとうございますmm

教えてもらった方法は次のように、numbersを操作して奇数だけの配列を得る方法ではないでしょうか?

こちら、ご指摘のとおりです。
Ito様に教えていただいたコードの方が、私が言いたいことを的確に表していると思いますので、記事の修正をさせていただきます。

勉強になりました、ありがとうございます!