在Ruby中调用调用对象

时间:2016-06-22 20:55:24

标签: ruby-on-rails ruby rubygems

有人可以解释为什么这会打印"晚安"?如果你删除了

string = "hello"

它将打印"晚安世界"

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

bedtime = "goodnight"
a_method(bedtime)

puts bedtime

我明白&lt;&lt;变异,但不是为什么添加= hello会产生如此大的差异?

1 个答案:

答案 0 :(得分:3)

在Ruby中,就地操作与返回副本的操作之间存在差异。有时,该名称会提供一个提示,例如gsub vs gsub!,但有时您需要知道,例如<<

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

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

如果你想要这样的效果,你可以string.replace("hello")进行字符串内容的就地重新分配。

要找出您所引用的对象,请在相关对象上引用object_id。您在此处会注意到,您的代码值会发生变化,但replace却没有。

Ruby方法参数由对象引用传递,实际上它很像指针。如果您希望通过绝对引用传递该值,则不是这种情况。