【发布时间】:2019-10-28 14:17:05
【问题描述】:
为什么变量 a 会发生变化,我该如何防止?
a = [] # => []
b = a # => []
b << :hello # => [:hello]
p a # => [:hello]
# >> [:hello]
我看到了使用克隆的响应,并想知道为什么下面的工作以及在哪些情况下需要和不需要 .clone
a = "string" # => "string"
b =a # => "string"
b = "changed" # => "changed"
a # => "string"
【问题讨论】:
-
没有哈希值。
-
哈希和数组是唯一使用指针的地方吗?和所有其他变量不是
-
它们都是参考。有些对象是可变的(数组、散列、字符串……),但有些不是(数字、符号、……)。
-
@muistooshort:不一定(尽管 OP 不应该阅读此内容,因为它可能会造成混淆)。 CRuby 中的
1不是引用(事实上,-4611686018427387904和4611686018427387903之间没有整数)。nil、false和true也不是引用。我认为浮动可能不是,但不是 100% 肯定。它们都透明地表现得好像它们是,在另一个实现中它们很可能是。 -
@Amadan 但就 Ruby 而言,它们都是参考。对适合指针的数字使用(滥用?)位模式(没有“这是什么东西”位)是一个实现细节。 AFAIK,符号在 C 级别使用类似的技巧。在 Ruby 中,您仍然可以说
6.some_method,所以6就像其他任何引用一样。我认为我们在这里分裂头发:)
标签: ruby