9

谁能解释这种行为

场景一

str = "hello"
str1 = str
puts str #=> hello
puts str1 #=> hello

str1 = "hi"
puts str1 #=> hi
puts str #=> hello

这里,改变 的值str1对 的值没有影响str

情景二

str = "hello"
str1 = str
str1.gsub! "hello", "whoa!"
puts str1 #=> whoa
puts str #=> whoa

效果不应该gsub!只有str1?为什么会发生变化str?如果str1只是持有对 的引用str,那么为什么Scenario-1中的值没有变化?

4

2 回答 2

17

仔细看下面:

场景一

str = "hello"
str1 = str
puts str #=> hello
puts str1 #=> hello
p str.object_id #=>15852348
p str1.object_id #=> 15852348

在上述情况下str,并str1持有对同一对象的引用,这由object_id. str1现在你在下面的例子中使用局部变量来保存一个新的对象"hi",这也被两个不同object_id的 s 所证明。

str1 = "hi"
puts str1 #=> hi
puts str #=> hello
p str.object_id  #=> 15852348
p str1.object_id #=> 15852300

情景二

`字符串#gsub!说:

就地执行 String#gsub 的替换,如果没有执行替换,则返回 str 或 nil。如果没有给出块并且没有给出替换,则返回一个枚举器。

str = "hello"
str1 = str
str1.gsub! "hello", "whoa!"
puts str1 #=> whoa
puts str #=> whoa
p str.object_id #=>16245792
p str1.object_id #=>16245792
于 2013-04-26T06:46:16.863 回答
0

在变量赋值中,是否存在同名的变量是没有影响的,如果有,它是什么值。在场景 1 中,str最终分配str1 = "hi"了,在此之前发生的任何事情都无关紧要。场景 1 与以下没有str1 = str.

str = "hello"
str1 = "hi"

在 Scenario-2 中,str并且str指的是同一个字符串。如果您通过指向该字符串的变量之一更改它,那么当您通过另一个变量调用它时,它指的是相同的更改字符串。

于 2013-04-26T07:05:27.430 回答