奇怪的红宝石字符串concat行为

时间:2015-02-08 03:04:08

标签: ruby ruby-on-rails-3 performance

我测试过以下代码:

irb(main):038:0> a=".";b="10"
=> "10"
irb(main):039:0> a+=b
=> ".10"
irb(main):040:0> a<<b
=> ".1010"

到目前为止一切顺利。现在让我们重复这个过程:

irb(main):042:0> a+=b+="4"
=> ".104"
irb(main):044:0> a
=> ".104"
irb(main):043:0> b
=> "104"

好...现在用&lt;&lt;

替换+ =
irb(main):045:0> a=".";b="10"
=> "10"
irb(main):046:0> a<<b<<"4"
=> ".104"
irb(main):047:0> a
=> ".104"
irb(main):048:0> b
=> "10"

如果&lt;&lt;代表+ =那么为什么b仍然是10而不是104?

3 个答案:

答案 0 :(得分:2)

<<+=不同。 x += y基本上是x = x + y的缩写。这会创建一个新字符串,并将其赋予x。例如:

> x = "hello"
> y = "world"
> old_x = x
> x += y
> x
"helloworld"
> old_x
"hello"
然而,

<<实际上修改了字符串:

> x = "hello"
> y = "world"
> old_x = x
> x << y
> x
"helloworld"
> old_x
"helloworld"

这将解释你所获得的差异。请注意,像a << b << "4"这样的东西是一个非常糟糕的做法,因为它在同一行上进行了两次修改。它以这种方式工作,因为<<已经保持关联性,因此它与a<<b;a<<"4"相同。这会将b添加到a,然后将“4”添加到a

答案 1 :(得分:0)

  

如果&lt;&lt;代表+ =那么为什么b仍然是10而不是104?

<< &#34;代表&#34; +=。他们是做不同事情的不同运营商。

a << b << c

相同
a << b
a << c

<<修改字符串并将其返回,因此子表达式(a << b)首先评估为a,然后a << c继续附加到a而不进行修改b

另一方面:

a += b += c

相同
b = b + c
a = a + b

答案 2 :(得分:-4)

  

如果&lt;&lt;代表+ =那么为什么b [sic]仍然是10而不是104?

因为,当条件为假时,无论结论是什么,整个句子都是正确的。

P     Q     If P then Q
false false true
false true  true
true  false false
true  true  true