【问题标题】:Instance variables assign value by reference in ruby实例变量在 ruby​​ 中通过引用赋值
【发布时间】:2019-10-23 11:59:02
【问题描述】:

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

这是我的代码。

@name = {:a=> 'sfgs', :b=> 'sdfsd'}
name = @name
name.except!(:a) 

当我打印 @name 时, :a 键值对已被删除。如果是这样,任何其他方法来防止这种情况。即复制实例变量而不引用。

【问题讨论】:

  • Ruby 是按值传递/复制。但在复杂对象的情况下,原始值及其副本是对其他地方对象的引用。
  • 经验法则是从不使用变异方法。
  • @AlekseiMatiushkin:出于性能原因,有时您必须这样做。但是,是的,这是一个很好的默认规则
  • @SergioTulentsev 不和你在一起,为什么?一般。
  • 顺便说一句,Hash#except! 是否有效 ruby?什么版本?

标签: ruby activesupport


【解决方案1】:

您需要deep copy。试试这个:

name = Marshal.load(Marshal.dump(@name))

name.except!(:a)
p name
#=> { :b => "sdfsd" }
p @name
#=> { :a => "sfgs", :b => "sdfsd" }

【讨论】:

  • 或者干脆不使用变异except!
  • 这里@name.dup 就足够了。
  • @AlekseiMatiushkin:直到有人决定破坏这些价值观:)
  • @SergioTulentsev “这里”是一个关键字。我显然知道dup 的工作原理:-P
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2020-01-08
相关资源
最近更新 更多