Rubyのeachとforの違いとは

バージョン情報

  • Ruby 2.7.0

Rubyのeachとforの違いとは?

他の数多くの言語がそうであるように、Rubyにもfor文がある。
全然見たことないので、書き方なんて忘れてしまうのだけど、こんなやつ ↓

for user in users
  puts user.name
end

Rubyの場合はforを使うよりeachを使う方が「rubyらしい!」と言われているので、forが使われているのを全くもって見たことがない。

forはどうやら、内部でオブジェクトのeachメソッドを実行して、その結果を使っているようだし、そんならforの存在意義ってなんだよ!?
と思っていたけど、少しは違いがあるらしい。

https://docs.ruby-lang.org/ja/2.7.0/doc/spec=2fcontrol.html#for
この説明によれば、

do … endまたは{ }によるブロックは新しいローカル変数の有効範囲を導入するのに対し、 for文はローカル変数のスコープに影響を及ぼさない点が異なるからです。

なるほど・・、実験してみようか。
つまりこういうことだな。

for i in [1, 2, 3]
  tmp1 = i
end

p tmp1
# => 3

[1, 2, 3].each do |i|
  tmp2 = i
end

p tmp2
# => NameError (undefined local variable or method `tmp2' for main:Object)

このように、forの中で突然変数を用意したとしても、forを抜けても使い続けることができる。
eachの場合は、その中で突然変数を用意しても、eachを抜けてしまうと使えなくなる。
でも、こんな特徴があったとしても、forを使う場面が思い浮かばない。なんだろうなあ・・・???

タイトルとURLをコピーしました