在 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 副本之间存在差异。有时名称会提供提示,例如 gsub
与 gsub!
,但有时您只需要知道,例如 <<
.
您在这里所做的是重新定义对象 string
引用,因此不会对原始引用进行永久修改。
行string = "hello"
并不意味着原来的bedtime
对象引用发生了变化。
如果你想要那种效果,你会做 string.replace("hello")
,这是字符串内容的就地重新分配。
要找出您正在引用的对象,请对相关对象调用 object_id
。您会在这里注意到,您的代码会更改该值,但 replace
不会。
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 副本之间存在差异。有时名称会提供提示,例如 gsub
与 gsub!
,但有时您只需要知道,例如 <<
.
您在这里所做的是重新定义对象 string
引用,因此不会对原始引用进行永久修改。
行string = "hello"
并不意味着原来的bedtime
对象引用发生了变化。
如果你想要那种效果,你会做 string.replace("hello")
,这是字符串内容的就地重新分配。
要找出您正在引用的对象,请对相关对象调用 object_id
。您会在这里注意到,您的代码会更改该值,但 replace
不会。
Ruby 方法参数由 对象引用 传递,这在实践中很像一个指针。如果您希望通过绝对引用传递该值,则情况并非如此。