任何人都可以解释行为
示例1
str = "hello"
str1 = str
puts str #=> hello
puts str1 #=> hello
str1 = "hi"
puts str1 #=> hi
puts str #=> hello
此处,更改str1
的值不会影响str
的值。
示例-2
str = "hello"
str1 = str
str1.gsub! "hello", "whoa!"
puts str1 #=> whoa
puts str #=> whoa
gsub!
只影响str1
吗?为什么会改变str
?如果str1
仅保留对str
的引用,那么为什么 Scenario-1 中的值不会更改?
答案 0 :(得分:17)
仔细看下面:
的方案-1 强> 的
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
证明。
str1 = "hi"
puts str1 #=> hi
puts str #=> hello
p str.object_id #=> 15852348
p str1.object_id #=> 15852300
<强>方案-2 强>
执行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
答案 1 :(得分:0)
在变量赋值中,对于是否存在具有相同名称的变量没有影响,如果是,则它是什么值。在方案-1中,str
最终被分配str1 = "hi"
,并且在此之前发生的任何事情都是无关紧要的。场景-1与没有str1 = str
的以下内容相同。
str = "hello"
str1 = "hi"
在场景-2中,str
和str
指的是相同的字符串。如果通过指向该字符串的其中一个变量进行更改,那么当您通过另一个变量调用它时,它会引用相同的更改字符串。