gpt4 book ai didi

Ruby local_variable 保持对@instance_variable 的引用

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:07 24 4
gpt4 key购买 nike

class Foo
def bar
@instance_variable = [['first']]

# make a duplicate object with the :dup method
local_variable=@instance_variable.dup

# They have different object_id
p @instance_variable.object_id
p local_variable.object_id


local_variable.each{|n|n.push('second')}
@instance_variable
end
end

f=Foo.new
p f.bar

=> 2000
=> 2002
=> [["first", "second"]]

看起来 local_variable 仍然引用 @instance_variable,尽管它是一个不同的对象。此行为与每个 block 中的 pushunshift 都有关系。使用像 local_variable='second' 这样的正常赋值,结果符合预期 => [['first']]

我不明白为什么 local_variable.each{|n|n.push('second')}@instance_variable 有影响

使用 Ruby-1.9.2p318

最佳答案

local_variable@instance_variable 都引用了同一个对象,即内部数组['first']。因为它是一个可变数组,所以您可以通过另一个数组影响对一个数组的更改。

Ruby 中的

Object#dup provides a shallow copy .为了制作数组的深拷贝,您需要编写一些代码(或找到一个库)递归地遍历数据结构,深度克隆其可变状态片段。

关于Ruby local_variable 保持对@instance_variable 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com