在 Ruby 中改变调用对象

Mutating Calling Objects in Ruby

谁能解释为什么会打印 "goodnight"?如果您删除了

string = "hello"

它将打印 "goodnight world" .

def a_method(string)
  string = "hello"
  string << " world"
end

bedtime = "goodnight"
a_method(bedtime)

puts bedtime

我知道 << 会发生变化,但不知道为什么添加 = hello 会产生如此大的差异?

在 Ruby 中,就地 操作与 return 副本之间存在差异。有时名称会提供提示,例如 gsubgsub!,但有时您只需要知道,例如 <<.

您在这里所做的是重新定义对象 string 引用,因此不会对原始引用进行永久修改。

string = "hello"并不意味着原来的bedtime对象引用发生了变化。

如果你想要那种效果,你会做 string.replace("hello"),这是字符串内容的就地重新分配。

要找出您正在引用的对象,请对相关对象调用 object_id。您会在这里注意到,您的代码会更改该值,但 replace 不会。

Ruby 方法参数由 对象引用 传递,这在实践中很像一个指针。如果您希望通过绝对引用传递该值,则情况并非如此。