【发布时间】:2020-06-28 16:19:26
【问题描述】:
我只是想确保我了解这里发生的事情。我知道 += 是重新分配,所以也许这就是为什么 str 没有被修改但为什么 upcase! 也不在这里修改 str ?
def change_me(str)
str += "?"
str.upcase!
end
question = "whats your name"
change_me(question)
puts question
'whats your name'
=> nil
【问题讨论】:
-
这是因为 Ruby 在传递参数时使用了
pass by value。 -
这不是真的@Rajagopalan,如果您删除
str += "?"行,该方法实际上会更改传递的字符串 -
有两种方法可以做你想做的事。一种是写
def change_me(str); str.replace(str.upcase + "?"); end,使用方法String#replace。另一种是将方法的操作行改为str[0..-1] = str.upcase + "?",即使用String#[]=。 -
@MarioF 不! Ruby 是按值传递的,请阅读此答案stackoverflow.com/a/10330589/9043475,非常重要的是阅读此答案下方的评论。
-
你可以运行我之前评论中建议的方法和@Mario 的“副作用”方法here。
标签: ruby