Ruby string 的 +=操作和<<操作问题

mobiwolf · 2012年03月08日 · 最后由 jiffies 回复于 2012年03月10日 · 3109 次阅读

情况一:

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

最终 original_string 变成了"Hello,World"

情况二:

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

最终 original_string 是"Hello,"。

问题:

为什么对二中对 hi 的操作怎么会让 original_string 也有变化呢?

用一个例子解释给你

>> original_string = "Hello, "
=> "Hello, "
>> hi = original_string
=> "Hello, "
>> original_string.object_id
=> 70187424554540
>> hi.object_id
=> 70187424554540
>> there = "World"
=> "World"
>> hi += there
=> "Hello, World"
>> original_string.object_id
=> 70187424554540
>> hi.object_id
=> 70187437196000   # 这里hi的object_id变了,说明hi是一个新对象,说明 "+=" 操作其实是产生一个新对象,并赋值给原来的变量,但是并未改变 original_string 

hi += there same with hi = hi + there

注意 ruby 中字符串对象=传递的是对象的引用,你可以先了解下“值传递”与“引用传递”。 << 不会产生新对象,所以上面代码中 hi 变 original_string 跟着变。 a += b大致相当于a = a+b,这时 a 已经不是旧的 a 了,是新生成的,只是同名而已。

@camel 值传递和引用传递是和 C 语言类似的概念吗?

@lgn21st 你的测试思路很好,学习了

#1 楼回答的好明白

需要 登录 后方可回复, 如果你还没有账号请 注册新账号