【问题标题】:Variables linking/pairing, and how to control or break these links变量链接/配对,以及如何控制或断开这些链接
【发布时间】:2012-01-26 13:52:24
【问题描述】:

在Rails 中,变量似乎是相互关联的,即如果你让a = b,如果你改变b,你也会改变a。而且,如果你改变了a,你也改变了b。

我来自原始的编程背景(FORTRAN 和 C:语言航空航天仍然被束缚),所以这种变量链接对我来说是新的。此外,它给我带来了一些麻烦,所以我正在寻找一种方法来控制它。

我希望能够将变量定义为闪烁的常量值(或值数组),并且在我专门重新定义该变量之前,让它保持不变。更具体地说,如果我这样做:

a = b

然后我想重新定义

b = q

我希望 a 保留原始 b 值(称为 b'),而新 b 具有值 q。

a = b'

b = q

a = b' != b = q

从 Rails 控制台查看下面的脚本,以进一步说明上述变量链接。你可以看出这两个变量是相互依赖的:你不能改变一个而不改变另一个。任何控制这种现象的帮助,或者只是参考我可以在哪里了解更多信息,将不胜感激。

system :004 >   b = []
 => [] 
system :005 > b = [123,456]
 => [123, 456] 
system :006 > a = b
 => [123, 456] 
system :007 > a
 => [123, 456] 
system :008 > b
 => [123, 456] 
system :009 > b[0]
 => 123 
system :010 > b[0]=789
 => 789 
system :011 > a
 => [789, 456] 
system :012 > b
 => [789, 456] 
system :013 > a[0] = 0
 => 0 
system :014 > a
 => [0, 456] 
system :015 > b
 => [0, 456] 
system :016 > 

【问题讨论】:

  • 这似乎只发生在散列中。即如果 a=[0,1]; b=a 然后 b => [0,1]... 那么如果你改变 a[0] 你也会改变 b[0]。但是如果您使用变量,例如 a = "asdf"; b=a, a="fjf" 然后 b 将保持为“asdf”。
  • 有趣,但有没有办法让哈希值保持不变?

标签: variables variable-assignment


【解决方案1】:

您遇到的主要问题是,一旦您创建了一个对象(例如 a),其他实例变量通常会创建指向同一对象的指针,而不是创建一个新对象。

在这个答案中:Object assignment and pointers 有人讨论了“赋值永远不会在 ruby​​ 中复制,但方法通常返回新对象而不是修改现有对象。”

简短回答:为确保您正在创建一个新对象(即不是指向同一个对象的新指针),请执行以下操作:

 b = a.dup

【讨论】:

  • 您的解决方案有效。特别是对于我上面遇到的问题。然而不幸的是,我仍然有一个问题。上面的问题是我的问题的简化。我剩下的问题是指向数据库的链接或指针,无论是否创建 .dup,每当您在变量上调用“.find”时,它都会返回数据库中查找它,而不是局部变量。我将环顾四周,看看是否有任何方法可以在局部变量中“查找”而不链接回根数据库,但如果您知道的话,我会非常感谢您的想法。
猜你喜欢
  • 2022-10-14
  • 2016-10-12
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多