[1,2,3].each{|x| a = x}
puts a
此處您已在該塊內創建了a
。因此a
只能在塊內部訪問。外界不知道誰是a
。 a
在詞彙範圍上可以阻止。因此,在您將a
引入到該塊的外部範圍之前,您正試圖使用MRI抱怨a
。如果您也試圖訪問x
,您將從MRI得到相同的抱怨。
[1].each do |x|
a = x
local_variables # => [:x, :a]
end
local_variables # => []
a = nil
[1,2,3].each{|x| a = x}
puts a
現在你該塊,這是最高級別之外創建a
。現在#each
方法採取塊{ |..| ... }
。在Ruby中,塊是關閉,即它可以訪問在塊定義之前創建的外部變量。在塊內部,您可以訪問您在外部定義的a
,並且還可以對其進行更新。現在,當bock將結束其執行時,您可以看到最後更新的值a
。 *但是,如果您嘗試訪問x
,您將得到相同的錯誤/投訴從MRI * - 原因是,x
從詞彙範圍到塊,您創建它的時間,第一次範圍,即在區塊之外,它不存在。
a = nil
[1].each do |x|
a = x
local_variables # => [:x, :a]
end
local_variables # => [:a]
您的錯誤信息是不正確的。你顯示的代碼應該抱怨'x'不是'a'。 – lurker
請重命名您的問題,以便解釋您所要求的內容。 – BroiSatse
您的問題陳述出錯。你的意思是'放一個',而不是'puts x'? – lurker