在ruby中,实例变量通过引用赋值
我怀疑在ruby中,ruby中的所有对象是否都通过引用传递或赋值。因为当我尝试将一个实例变量分配给local时。对本地变量所做的更改也会影响实例变量 这是我的密码在ruby中,实例变量通过引用赋值,ruby,activesupport,Ruby,Activesupport,我怀疑在ruby中,ruby中的所有对象是否都通过引用传递或赋值。因为当我尝试将一个实例变量分配给local时。对本地变量所做的更改也会影响实例变量 这是我的密码 @name = {:a=> 'sfgs', :b=> 'sdfsd'} name = @name name.except!(:a) 当我打印@name时:一个键值对已被删除。如果是这样,有没有其他方法来防止这种情况。i、 e复制实例变量而不引用。您需要深度复制。试试这个: name = Marshal.load(Mar
@name = {:a=> 'sfgs', :b=> 'sdfsd'}
name = @name
name.except!(:a)
当我打印@name时:一个键值对已被删除。如果是这样,有没有其他方法来防止这种情况。i、 e复制实例变量而不引用。您需要
深度复制
。试试这个:
name = Marshal.load(Marshal.dump(@name))
name.except!(:a)
p name
#=> { :b => "sdfsd" }
p @name
#=> { :a => "sfgs", :b => "sdfsd" }
Ruby是按值传递/复制的。但对于复杂对象,原始值及其副本是对其他地方对象的引用。经验法则是永远不要使用变异方法。@AlekseiMatiushkin:出于性能原因,有时必须这样做。但没错,这是一个很好的违约rule@SergioTulentsev为什么不跟你在一起?在general.BTW中,是
Hash#except代码>有效?什么版本?或者干脆不使用变异除了
这里@name.dup
就足够了。@AlekseiMatiushkin:除非有人决定破坏这些值:)@SergioTulentsev“这里”是一个关键字。我显然知道dup的工作原理:-P