2017-09-16 86 views
0
a = %W(a b c).each {|a| a << "\n"} 
a.each {|a| print a} 

显示器的区别:
一个
b
Ç红宝石: “+ =” 和 “<<” 弦乐

a = %W(a b c).each {|a| a += "\n"} 
a.each {|a| print a} 

dispays:ABC

其原因是什么区别?

+0

你到目前为止做了哪些研究?你有没有试过打印'a.inspect'? –

回答

2

请注意,<<是一个in-place修饰符,即它改变了字符串包含的内容。 +=是组合加法赋值运算符,用于更改变量指向的内容,但不会更改原始对象。

比较:

a = "a" 
a.object_id 
# => ...4680 

a += "b" 
a.object_id 
# => ...3960 

a现在指向一个完全不同的对象。当您在each循环中执行此操作时,您不会更改存储在数组中的原始对象,而是正在改变仅存在于该循环迭代范围内的变量。

往前一步:

a << "c" 
a.object_id 
# => ...3960 

它仍然是同一个对象。字符串,像很多容器类型的对象,如数组和哈希,通常有一些方法可以进行就地修改,其他方法可以返回副本。 String#subString#sub!之间有很大的差异。