Rubyの「for」と「each」
概要
Ruby のループに関して簡単な質問がありました。コレクションを反復処理するこれら 2 つの方法に違いはありますか?
# way 1
@collection.each do |item|
# do whatever
end
# way 2
for item in @collection
# do whatever
end
これらがまったく同じなのか、それとも微妙な違いがあるのか(おそらく @collection が nil の場合)、疑問に思っています。
解決策
唯一の違いは次のとおりです。
それぞれ:
irb> [1,2,3].each { |x| }
=> [1, 2, 3]
irb> x
NameError: undefined local variable or method `x' for main:Object
from (irb):2
from :0
のために:
irb> for x in [1,2,3]; end
=> [1, 2, 3]
irb> x
=> 3
for ループでは、イテレータ変数はブロックが完了した後も存続します。 each ループでは、ループの開始前にローカル変数として定義されていない限り、そうではありません。
それ以外では、for は各メソッドの単なる構文糖です。
@collection が nil の場合、両方のループが例外をスローします。