2010-11-11 29 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

相关问题