Techioz Blog

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 の場合、両方のループが例外をスローします。