这是我试过的:
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也改变了?
更新: 将变量作为参数传递给方法的时候怎么样?为什么接收变量具有相同的引用?
它们引用相同的对象:
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#<<如果没有分配新对象,它会附加到给定的字符串,从而更改接收器.
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)
现在两者,a并b引用相同的对象.唯一的区别是Ruby中不能更改整数,它们是固定的.
再次,引用传递:
a = "foo"
p = proc { |x| x << "bar" }
p.call(a)
a
#=> "foobar"
Run Code Online (Sandbox Code Playgroud)