2010-11-11 36 views
1

只是好奇,爲什麼我不能從'local_variables'數組中刪除聲明的局部變量。local_variables的行爲 - 任何人都可以解釋嗎?

實施例:

x=1 
myarr = local_variables.clone 
p local_variables 
=> [:x, :_] 
p myarr 
=> [:x, :_] 
p local_variables.class 
=> Array 
p myarr.class 
=> Array 
myarr.delete :x 
p myarr 
=> [:_] 
local_variables.delete :x 
p local_variables 
=> [:x, :_] 

WTF?

我也懷疑調用local_variables.delete與參數:X重新插入回來,因爲它是重新申報。但如果與其他以前未聲明的符號調用不會改變它:

p local_variables 
=> [:x, :_] 
local_variables.delete :whatever 
p local_variables 
=> [:x, :_] 

有人可以解釋嗎?

Thx。

回答

4

考慮以下方法:

def foo 
    [42, 23, 13] 
end 

foo #=> [42, 23, 13] 
foo.delete 23 
foo #=> [42, 23, 13] 

難道這種行爲令你感到驚訝?

每次調用local_variables(或foo)創建一個新的陣列時間。如果您修改了新的陣列,如果您再次撥打local_variables,將不會發生什麼影響。

+0

我看到,它只是返回一個數組的實例的方法。這是一個解釋。謝謝。 – 2010-11-11 20:42:17

+0

它只是提出了一個問題,即如何在程序運行時確定符號是變量還是方法。必須有可能,因爲Ruby解釋器必須知道如何處理它。 – 2010-11-11 21:02:32

+0

@David:'local_variables.include?(symbol)' – sepp2k 2010-11-11 21:06:30

0

AFAIK這是不可能去除變量:

http://programming.itags.org/ruby/64695/

+0

這很奇怪,聽起來有點不起眼。爲什麼它的行爲不同,儘管它們都是同一個Array類的instaces? – 2010-11-11 19:58:50

5

local_variables返回一個包含所有當前聲明局部變量的名稱的數組。你可以做任何你想要的數組,但是這顯然不會影響聲明哪些局部變量。爲什麼呢?如果你從電話簿中刪除一個名字,那麼這個人死了嗎?

+0

電話簿比喻+1。 – Zabba 2010-11-11 19:52:36

+0

好吧,它只保存局部變量名稱。但爲什麼hell .delete方法不能像其他Array類實例那樣工作?這是我的問題的重點。 – 2010-11-11 20:32:10

+0

@David Unric:「'.delete」方法對於其他'Array'類實例不起作用?「我不明白它是如何做到的。 'Array#delete'從數組中刪除一個對象,這正是它在這裏所做的。你不存儲對該數組的引用,所以你將永遠不能*確認*它已被刪除,但它仍然是。 (實際上,你可以使用'ObjectSpace.each_object(陣列)'找到陣列和驗證這種方式,或者你可以只把它分配給一個變量。) – 2010-11-11 22:57:07

相關問題