local_variables的行为 - 任何人都可以解释吗?
只是好奇,为什么我不能从'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。
考虑以下方法:
def foo
[42, 23, 13]
end
foo #=> [42, 23, 13]
foo.delete 23
foo #=> [42, 23, 13]
难道这种行为令你感到惊讶?
每次调用local_variables
(或foo
)创建一个新的阵列时间。如果您修改了新的阵列,如果您再次拨打local_variables
,将不会发生什么影响。
AFAIK这是不可能去除变量:
这很奇怪,听起来有点不起眼。为什么它的行为不同,尽管它们都是同一个Array类的instaces? – 2010-11-11 19:58:50
local_variables
返回一个包含所有当前声明局部变量的名称的数组。你可以做任何你想要的数组,但是这显然不会影响声明哪些局部变量。为什么呢?如果你从电话簿中删除一个名字,那么这个人死了吗?
电话簿比喻+1。 – Zabba 2010-11-11 19:52:36
好吧,它只保存局部变量名称。但为什么hell .delete方法不能像其他Array类实例那样工作?这是我的问题的重点。 – 2010-11-11 20:32:10
@David Unric:“'.delete”方法对于其他'Array'类实例不起作用?“我不明白它是如何做到的。 'Array#delete'从数组中删除一个对象,这正是它在这里所做的。你不存储对该数组的引用,所以你将永远不能*确认*它已被删除,但它仍然是。 (实际上,你可以使用'ObjectSpace.each_object(阵列)'找到阵列和验证这种方式,或者你可以只把它分配给一个变量。) – 2010-11-11 22:57:07
我看到,它只是返回一个数组的实例的方法。这是一个解释。谢谢。 – 2010-11-11 20:42:17
它只是提出了一个问题,即如何在程序运行时确定符号是变量还是方法。必须有可能,因为Ruby解释器必须知道如何处理它。 – 2010-11-11 21:02:32
@David:'local_variables.include?(symbol)' – sepp2k 2010-11-11 21:06:30