Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中,实例变量通过引用赋值_Ruby_Activesupport - Fatal编程技术网

在ruby中,实例变量通过引用赋值

在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

我怀疑在ruby中,ruby中的所有对象是否都通过引用传递或赋值。因为当我尝试将一个实例变量分配给local时。对本地变量所做的更改也会影响实例变量

这是我的密码

@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