在下面的代碼,a
被的times
外部初始化,但times
創建內部範圍,並a
是可訪問的:局部變量時的方法和方法調用變量
a = 5
3.times do |n|
a = 3
end
a # => 3
的a
返回值是3
因爲a
可從3.times do ... end
創建的範圍中獲得,該範圍允許重新分配a
的值。實際上,它重新分配了a
到3
三次。
爲什麼以下不同?
a = 5
def adder(num)
num = 3
end
adder(a) # => 3
a # => 5
這是因爲我們在a
帶來的,但它不會改變局部變量,也許是因爲它的方法。我不知道。爲什麼是a
5
而不是3
?
爲什麼你的方法叫'加法器'?它不添加任何東西。 – Stefan
對不起,我只是想弄清範圍規則。無視愚蠢的方法名稱,我認爲我理解ruby中的範圍規則,但我認爲自己很困惑。規則對我來說並不清楚。 在第一個例子中a = 3,因爲塊中存在範圍泄漏?還是因爲a = 3重新分配? 然後在第二個例子中,在末尾做了一個=> 5,因爲變量是通過值而不是通過引用傳遞給方法的?如果在方法內部有一個<<操作會影響a的值,那該怎麼辦?它很混亂 –
您可以通過其方法修改(變更)傳遞的對象,例如, 'array << element'。但是你不能從一個方法內重新分配外部作用域的變量。試圖這樣做只會在方法的內部作用域中創建一個局部變量。請參閱https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing – Stefan