Ruby の for と each の違い
    
    
            Stewart Nguyen
    2023年1月30日
    
    Ruby
    Ruby Loop
    
 
Ruby では、Array#each と for..in の両方を使用して配列を反復処理できます。ただし、この 2つには大きな違いがあります。
Ruby の Array#each
    
Ruby の Array#each メソッドは、配列内の個々のアイテムを反復処理するための最も簡単で広く使用されているメソッドです。
each はクラス Array の組み込みメソッドであり、Ruby 配列の項目を反復処理するための最も一般的な方法です。
each はパラメータとしてブロックを取り、現在のアイテムを返します。
[1, 2, 3].each { |n| puts n }
出力:
1
2
3
Ruby の for..in ループ
他のほとんどのプログラミング言語と同様に、Ruby には配列をループするための for ステートメントがあります。
for の後には、現在の要素としての変数と反復配列が続きます。
for n in [1, 2, 3]
  puts n
end
出力:
1
2
3
内部的には、Array#each と for..in はほぼ同じことを行います。ただし、重大な問題を引き起こす可能性のある小さな違いが 1つあります。
[1, 2, 3].each { |n| n }
puts n
出力:
NameError (undefined local variable or method `n' for main:Object)
コードサンプル:
for n in [1, 2, 3]
 n
end
puts n
出力:
3
Array#each の後に n を出力しようとするとエラーが発生しますが、for ループの後に 3 が出力されます。
どうしたの?
for..in が実行される前に、変数 n が事前に定義されています。ブロックが完了した後も、ブロックの外側に表示されたままになります。
つまり、for ループは次のようになります。
n = nil
[1, 2, 3].each { |i| n = i }
puts n
出力:
3
Array#each の場合、変数 n はブロック {| n |内で定義されます。puts n} であるため、ブロックのスコープ外には表示されません。
for ループを使用すると、副作用として余分な変数が導入され、イライラする問題が発生する可能性があります。その結果、for..in よりも Array#each が優先されます。
        チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe