为什么`<<`附加到Ruby字符串而`+ =`不附加?

时间:2014-04-18 16:12:34

标签: ruby string reference

我现在正在完成一个教程,我想了解发生以下情况的原因:

original_string = "Hello, "
hi = original_string
there = "World"
hi += there
assert_equal "Hello, ", original_string

original_string = "Hello, "
hi = original_string
there = "World"
hi << there
assert_equal "Hello, World", original_string

为什么+=original_string没有影响,<<呢?我绝对肯定第二种情况也会等于"Hello, ",但事实并非如此。

第一个示例中的

hi = original string似乎将original_string的值复制到hi,但第二个示例中的hi = original string似乎将hi设置为指向与original string相同的字符串。我猜在幕后会有一些关于是复制值还是复制引用的隐含决定......或者什么。

3 个答案:

答案 0 :(得分:3)

字符串上的

<<会改变原始对象,而+=会创建一个副本并返回该对象。

请参阅以下相应字符串的object_id

2.1.1 :029 > original_string = "Hello, "
 => "Hello, " 
2.1.1 :030 > hi = original_string
 => "Hello, " 
2.1.1 :031 > there = "World"
 => "World" 
2.1.1 :032 > original_string.object_id
 => 70242326713680 
2.1.1 :033 > hi.object_id
 => 70242326713680 

2.1.1 :034 > hi += there
 => "Hello, World" 
2.1.1 :035 > hi.object_id
 => 70242325614780 

请注意第35行object_id上的不同hi。在上面的示例中将hi重置为original_string并使用<<后,它会修改同一个对象。

答案 1 :(得分:3)

在这两个示例中,hi = original_string复制了引用。

但是,对于+=,您重新分配hi以指向新字符串,即使变量名称相同。

这是因为hi += there在解释器中扩展为表达式hi = hi + there

在此操作之前,hioriginal string共享对同一字符串对象的引用。在扩展表达式中进行=操作后,hi现在引用新创建的hi + there字符串结果。

在表达式hi << there中,没有任何内容可以改变hi引用的对象。它引用与original_string相同的字符串,因此hioriginal_string都反映了更改(当然这是因为它们都引用了相同的字符串对象)。 / p>

答案 2 :(得分:1)

您应该查看String类的Ruby文档:

String#+ method

String#<< method