Ruby 中的 for 與 each
Stewart Nguyen
2023年1月30日
2022年5月18日
在 Ruby 中,你可以使用 Array#each
和 for..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#each
和 for..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
。