for文とeachの違いってなんなん?

最近コードレビューをしていて、for文を使っているコードを読んだときに、「Rubyだったらeach使いなよ」とレビューしてました。

Rubyだったらeach。お決まりのように考えていたのですが…なんで?

違い

結論から言うと、for文は配列の要素を受け取る変数、for文の中で作成したローカル変数がfor文の外でも扱うことができるということ

each文

numbers = [1, 2, 3, 4]
sum = 0

numbers.each do |n|
  sum += n
  sumsum = sum += n
end

irb(main):014:0> sum
=> 10

irb(main):025:0> sumsum
NameError: undefined local variable or method `sumsum' for main:Object
    from (irb):25
    from /Users/kei/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'

for文

numbers = [1, 2, 3, 4]
sum = 0

for n in numbers
  sum += n
  sumsum = sum += n
end

irb(main):016:0> n
=> 4
irb(main):017:0> sum
=> 10
irb(main):018:0> sumsum
=> 10

for文の外でも使えてる!

なぜかも説明できないのに「そういうもんだから」っていうのはだめだなぁ…と感じました。もっと勉強しよ。

f:id:takakudakei:20181129005549j:plain