Ruby中的破坏性和非破坏性方法

Ruby中的破坏性和非破坏性方法,ruby,Ruby,不久前我问过这个问题-。作为跟进,我对代码做了一些修改,但我仍然不确定到底发生了什么。为什么+不修改str指向的对象?我不会再重新分配str了,对吗 def change_字符串(str) str+“?” 上回! 结束 短语=“现在几点了” 更改字符串(短语) 用短语 该短语已上格,但未添加问号。如果我删除了将对象上置的最后一行,则会追加“?”。为什么会这样?是因为+是非破坏性的,而且是上置的是什么?或者这里发生了什么我没有注意到的事情。记住Ruby中的变量很重要,这是对对象的有效引用,或者用

不久前我问过这个问题-。作为跟进,我对代码做了一些修改,但我仍然不确定到底发生了什么。为什么
+
不修改
str
指向的对象?我不会再重新分配
str
了,对吗

def change_字符串(str)
str+“?”
上回!
结束
短语=“现在几点了”
更改字符串(短语)
用短语

该短语已上格,但未添加问号。如果我删除了将对象上置的最后一行,则会追加“?”。为什么会这样?是因为
+
是非破坏性的,而且
是上置的是什么?或者这里发生了什么我没有注意到的事情。

记住Ruby中的变量很重要,这是对对象的有效引用,或者用更专业的术语来说,是一个带有整数引用计数的奇特指针

这意味着类似于
str
的东西,比如说,只是对某个字符串对象的引用。像
upcase这样的方法更改该对象。类似于
upcase
的方法不会返回新对象。文档中解释了这些差异,您必须检查文档,以确保正确无误。
是不够的,因为像
Array#pop
这样的方法改变了数组,并且没有那种装饰

当你写这样一行时:

str + '?'
这确实会创建一个新对象,但由于您从未将其实际捕获到变量或将其用作参数,因此会立即将其丢弃

你的意思是:

str = str + '?'
或者更简洁地说:

str += '?'

如果两者都创建了一个新对象,则将
str
作为该新对象的引用。

str+“?”
不会修改
str
。所做的只是说“通过组合
str
和?来创建一个新字符串,但不要将其分配给变量。”如果删除
str.upcase,它就会起作用行是在Ruby中,方法的最后一行是它的返回值。因此,当
str+“?”
是方法的最后一行时,这是您的返回值。谢谢,这很有帮助。相反,您可以使用
str@anothermh返回最后一行,但她没有存储在任何位置,所以它仍然不会打印
所以没有更改。变量不能变异,因为它不是对象。变量引用由唯一对象id标识的对象。通过赋值,可以使变量引用不同的对象。或者,可以修改或变异变量引用的对象。假设你把你的手机命名为“苏”,它停止工作了,所以你把它拿去修理。如果更换了手机,您可能会决定将新手机指定给相同的名称“Sue”(“Sue”现在引用不同的对象)。如果手机被修复或变异,“Sue”继续引用同一部旧手机。@CarySwoveland想在这里创建一个新字符串,所以在这种情况下,
+“?”