红宝石串的范围是什么?

ZX1*_*12R 3 ruby string

这是我试过的:

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"
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*fan 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
Run Code Online (Sandbox Code Playgroud)

String#<<如果没有分配新对象,它会附加到给定的字符串,从而更改接收器.

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

b = a.clone
a == b      #=> true (same string values)
a.equal? b  #=> false (different objects)
Run Code Online (Sandbox Code Playgroud)

关于整数

引用没有区别:

a = 100
a.object_id  #=> 201
b = a
b.object_id  #=> 201
Run Code Online (Sandbox Code Playgroud)

现在两者,ab引用相同的对象.唯一的区别是Ruby中不能更改整数,它们是固定的.

将变量作为参数传递

再次,引用传递:

a = "foo"
p = proc { |x| x << "bar" }
p.call(a)
a
#=> "foobar"
Run Code Online (Sandbox Code Playgroud)