2016-07-25 169 views
2

我想玩红宝石代码。字符串替换红宝石

这里就是我的了:

name = "Rol" 
title = name 
name = "Sam" 
puts name 
puts title 

OUTPUT: 
Sam 
Rol 

name = "Rol" 
title = name 
name.replace("Sam") 
puts name 
puts title 

OUTPUT: 
Sam 
Sam 

基本上,我不知道为什么,当我使用的重新分配等号它只是改变变量名,并与旧值留下的称号。然而,在使用替换方法时,它会改变两者的值?

对外行人的任何解释?新手在红宝石在这里。

回答

6

简单通俗地说是:

  • 分配变化的变量。

  • 突变方法改变对象。

Ruby中的变量和对象是不同的东西。每个变量都是一个标签,指向的一个对象。每个方法调用都是发送给对象的。为了方便起见,我们经常简化讨论,因为当名称是'Sam'时,我们的意思是“存储在名称变量所指向的字符串对象中的值是'Sam'”,因此很容易说出来。“

在你的第一个例子:

线name = "Rol"创建从字面"Rol"一个新的String对象,并在它指向局部变量name

线title = name点局部变量title到相同的字符串对象。

name = "Sam"从文字"Sam"创建一个新的String对象,并指向它的本地变量name。现在nametitle指向不同的String对象。

在这一点上有两个独立的字符串变量,有两个不同的变量指向它们,所以它们中的任何用途保持独立。

在你的第二个例子:

线name = "Rol"创建从字面"Rol"和关键点是局部变量name一个新的String对象。

线title = name点局部变量title到相同的字符串对象。

线name.replace("Sam")修改对象。首先访问对象时使用哪个变量无关紧要。 title.replace("Sam")将具有相同的结果,因为它是指相同的对象。

3

答案很简单。 当你拨打:

title = name 

那么这两个变量:标题和名称都引用同一个对象,这是下一个被修改:

name.replace("Sam") 
2

String#replace取代由name引用的字符串的内容。但是,它在参考级别与=相反,它将一个新的String对象分配给左侧变量。

name被分配给title,这意味着在那个时间点两个变量都指向相同的内存分配。由于replace取代了引用的字符串,所以更改被有效地传播到两者。

如果比较值的object_id,则会更好。在分配的情况下,对象ID的变化,因为你有效地创建并分配一个新的对象:

name = "Rol" 
title = name 
name.object_id 
# => 70336016119860 
title.object_id 
# => 70336016119860 
name = "Sam" 
name.object_id 
# => 70336016085020 
title.object_id 
# => 70336016119860 

对于replace的情况下,相反,object_id不会改变,因为你直接改变值,而无需创建一个新的对象。

name = "Rol" 
title = name 
name.object_id 
# => 70336003479640 
title.object_id 
# => 70336003479640 
name.replace("Sam") 
name.object_id 
# => 70336003479640 
title.object_id 
# => 70336003479640