簡體   English   中英

Ruby循環局部變量和不變性

[英]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你的代碼是不純的和可變的:

  1. 您分配給zaz但從未在塊內實際使用它。 因此,這唯一有意義的唯一方法是zaz是外部作用域中的局部變量,並且您正在分配它。 盡管在這種情況下,您的整個循環僅等效於zaz = foo.last.first
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM