3

这是我尝试过的:

a = "Hello world"
a.object_id    # => -633222538
b = a
b.object_id    # => -633222538
b << " i say"  # => "Hello world i say"
a              # => "Hello world i say"

为什么两个变量ba具有相同的对象ID?另外,当我改变时b,怎么a也改变了?

更新: 当变量作为参数传递给方法时怎么样?为什么接收变量具有相同的引用?

4

4 回答 4

5

他们引用同一个对象:

a = "Hello world"     # a now references #-633222538
b = a                 # b now references #-633222538, too
b << " i say"         # this appends " i say" to #-633222538
a                     # a still references #-633222538

String#<<不分配新对象,它附加到给定的字符串,从而改变接收者。

我想要一份副本,您可以使用clonedup

b = a.clone
a == b      #=> true (same string values)
a.equal? b  #=> false (different objects)

关于整数

引用没有区别:

a = 100
a.object_id  #=> 201
b = a
b.object_id  #=> 201

现在两者都a引用b同一个对象。唯一的区别是整数不能在 Ruby 中更改,它们是固定的。

将变量作为参数传递

再次,引用被传递:

a = "foo"
p = proc { |x| x << "bar" }
p.call(a)
a
#=> "foobar"
于 2013-06-14T13:35:49.197 回答
2

输入参考文献

答案是 Ruby 中的变量(除了少数例外,尤其是绑定到整数的变量)不包含对象值。a不包含“Hello world”。相反,a包含对字符串对象的引用。它是字符串对象,具有包含组成“Hello World”的字母的特征。

在左边是变量名,右边是对象的赋值中,变量接收到对象的引用。在从一个变量到另一个变量的赋值中a = b

变量持有对对象的引用这一事实对更改对象的操作有影响。字符串连接操作

b << " i say"

b用文本“我说”连接作为引用的字符串的字符。该变量a包含对同一字符串对象的另一个引用。即使替换消息转到b,它也会导致引用 inb所指的对象发生更改。当您打印出来时a,您会看到结果:字符串的内容已更改。

Ruby 中的一些对象作为立即值存储在变量中。这些包括整数、符号(看起来像:this)和特殊对象truefalsenil。当您将这些值之一分配给变量 ( x = 1) 时,该变量将保存该值本身,而不是对其的引用。

从Manning The Well Grounded Rubyist复制和修改。

于 2013-06-14T13:49:14.927 回答
1

看起来您在一个变量上调用了一个可变函数,该变量与另一个变量共享同一个对象。如果你改为 b = b + 'i say' a 将保持不变。

于 2013-06-14T13:33:20.937 回答
0

变量ab是对 String 对象的引用。当您完成b = a作业时,您复制了参考。它不会创建对象的新副本。如果要将字符串对象复制到新对象中,可以执行以下操作:

a = "abc"
b = ""  [or, b = String.new]
b << a

现在将是不同的、独立的字符串对象,其值为“abc” ab

于 2013-06-14T13:35:09.483 回答