[英]Ruby loop local variables and inmutability
我有以下代碼:
# Assuming each element in foo is an array.
foo.each do |bar|
zaz = bar.first
# Other code using zaz, but not modifying it.
end
是否會在此循環內的每次迭代中修改zaz
局部變量,使其可變? 我不確定Ruby的行為。
實際上,這取決於循環之前的代碼。
如果這就是全部代碼,則zaz
是塊局部變量,並且每次評估循環體時都將創建一個新的 zaz
變量。
但是,如果周圍范圍中有zaz
局部變量,則zaz
是塊中的自由變量,並且由於塊范圍嵌套在其周圍范圍中,因此,將zaz
重新分配該塊外部的現有zaz
變量再次,每次評估塊。
通過在塊的參數列表中明確將其聲明為塊局部變量,可以確保zaz
始終被視為塊局部變量,並且永遠不會在周圍的范圍中查找:
foo.each do |bar; zaz|
zaz = bar.first
end
但是請注意,你的代碼才有意義IFF你的代碼是不純的和可變的:
zaz
但從未在塊內實際使用它。 因此,這唯一有意義的唯一方法是zaz
是外部作用域中的局部變量,並且您正在分配它。 盡管在這種情況下,您的整個循環僅等效於zaz = foo.last.first
。 each
僅評估其副作用。 沒有副作用, each
副作用就完全沒有意義,因此您正在使用each
副作用這一事實意味着您有副作用。 注意,沒有附加限定的術語“不變”通常是指值。 在談論“不可變變量”時,我們通常會明確地說“不可變變量”,以表明我們只是在談論變量是否可以重新綁定,而不是在改變對象狀態。 或者,可以只說“常量”,這是“不可變變量”的技術術語……盡管該術語在Ruby中已經具有特定的含義。
each
循環通常會使對象變異。 每個人都必須做某事。 因為each
元素都不會返回任何有用的信息-它會返回數組本身,所以如果將每個元素發送到某個地方(例如在屏幕上打印),它都不會使對象發生變異。
foo.each do |bar|
# do something with element like
# print it, change it, save it
end
功能替代圖
foo.map { |bar| bar.something }
它返回新數組,這是以不變方式處理的原始數組。 顯然,您必須小心使用不可變的方法。 這不是一成不變的:
foo.map { |bar| bar.something! }
在這里something!
對數組元素有破壞性。 但是我從未見過像那樣使用過的map
。 使用each
破壞性的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.