任何人都可以解释为什么{1}在版本1中发生变异? foo
和<<
分配有什么区别?
版本1
=
VERSION2
foo = "apple"
bar = foo
"foo: #{foo}" # => foo: apple
bar << "hello"
"bar: #{bar}" # => bar: applehello
"foo: #{foo}" # => foo: applehello
答案 0 :(得分:3)
因为=
是你所说的任务
但是<<
不是赋值 - 当左操作数是字符串时它是连接运算符。
所以:
bar = bar + "hello"
通过将bar
的内容与&#34; hello&#34;相结合来创建新字符串。然后将新字符串分配给变量bar
,同时:
bar << "hello"
字符串 - bar
的就地连接是否会被设置为新字符串,但它所保留的字符串将被修改。
因此,使用<<
bar和foo仍然会引用同一个对象,而=
只有bar获取新值。
答案 1 :(得分:0)
您将bar
设置为对foo
的引用。 <<
运算符与第一个版本一样,第二个版本使用+
生成新值,而不更改原始值。
答案 2 :(得分:0)
bar << "hello"
附加到bar
(foo
),而bar = bar + "hello"
创建字符串的副本,foo
保持不变。
答案 3 :(得分:0)
与+
的字符串连接返回一个新对象:
http://www.ruby-doc.org/core-2.1.0/String.html#method-i-2B
append运算符作用于引用指向的对象:
http://www.ruby-doc.org/core-2.1.0/String.html#method-i-3C-3C
在第一个示例中,您将追加foo和bar指向的对象。
在第二个例子中,你要添加&#34;你好&#34;到bar指向的对象返回一个新对象,反过来,bar现在指向所有的foo,而foo仍然指向其值仍为&#34; apple&#34;
的对象答案 4 :(得分:0)
首先要注意以下几点: -
str = "test"
#=> "test"
str[1]
#=> "e"
str1 = str
#=> "test"
str.object_id
#=> 8509820
str1.object_id
#=> 8509820
因此,字符串存储为Ruby中每个字符的数组。如果您只使用char类型引用,Java等其他语言也会返回完整的字符串。类似地,我们也将第二个字符串的每个字符串添加到第一个字符串的字符数组中。
str << "string"
#=> "teststring"
str1
#=> "teststring"
str.object_id
#=> 8509820
str1.object_id
#=> 8509820
这里没有创建新对象。相同的数组保存第二个字符串的每个字符。
现在观察以下内容: -
str = "test"
#=> "test"
str1 = str
str.object_id
#=> 9812345
str1.object_id
#=> 9812345
str = str + "string"
#=> "teststring"
str.object_id
#=> 9901234
str1
#=> "test"
str1.object_id
#=> 9812345
在这里,我们看到+
运算符会导致创建新对象。