我测试过以下代码:
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?
答案 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