通过引用/复制字符串分配?

时间:2013-04-26 06:43:49

标签: ruby

任何人都可以解释行为

示例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 中的值不会更改?

2 个答案:

答案 0 :(得分:17)

仔细看下面:

方案-1

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

在上面的案例中,strstr1持有对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!说:

  

执行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中,strstr指的是相同的字符串。如果通过指向该字符串的其中一个变量进行更改,那么当您通过另一个变量调用它时,它会引用相同的更改字符串。