字符串替换Ruby

时间:2016-07-25 07:44:46

标签: ruby

我正试图在ruby中玩我的代码。

这是我得到的:

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

基本上我想知道为什么当我使用重新分配等号时它只更改变量名称并将标题保留为旧值。但是在使用replace方法时,它会改变两者的值?

外行人的任期解释是什么?红宝石在这里新手。

3 个答案:

答案 0 :(得分:6)

简单的外行术语是:

  • 作业更改变量。

  • 变异方法会改变对象。

变量和对象在Ruby中是不同的东西。每个变量都是指向对象的标签。每个方法调用都是发送到一个对象。为了方便起见,我们经常简化讨论,因为很容易说'#34;名字是' Sam'"详细我们的意思是"存储在name变量指向的String对象中的值是' Sam'"

在您的第一个示例中:

name = "Rol"行从文字"Rol"创建一个新的String对象,并将局部变量name指向它。

title = name行将局部变量title指向同一个String对象。

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

此时有两个独立的String变量,两个不同的变量指向它们,因此它们的任何使用都是分开的。

在您的第二个示例中:

name = "Rol"行从文字"Rol"创建一个新的String对象,并将局部变量name指向它。

title = name行将局部变量title指向同一个String对象。

name.replace("Sam")修改对象。首先用于访问对象的变量并不重要。 title.replace("Sam")会有相同的结果,因为它引用同一个对象。

答案 1 :(得分:3)

答案很简单。 当你打电话:

public class B<T> : A<T> where T : class, new()
{
    public B<T>(IEnumerable<T> data) : base(data) { ... }
}

然后两个变量:title和name都引用了同一个对象,接下来修改为:

title = name

答案 2 :(得分: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