Ruby 中的 for 與 each

Stewart Nguyen 2023年1月30日
  1. Ruby 中的 Array#each
  2. Ruby 中的 for..in 迴圈
Ruby 中的 for 與 each

在 Ruby 中,你可以使用 Array#eachfor..in 來遍歷陣列。但是,兩者之間存在顯著差異。

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#eachfor..in 幾乎做同樣的事情。但是,有一個微小的差異,可能會導致嚴重的問題。

[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 迴圈可能會引入額外的變數作為副作用,從而導致令人沮喪的問題。結果,Array#each isprefered 勝過 for..in