2015-02-08 47 views
0

我已經測試下面的代碼:奇怪的紅玉字符串連接行爲

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" 

好...現在代替+ =與< <

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" 

如果< <代表+ =那麼爲什麼b爲仍爲10,而不是104?

回答

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"相同。這將在a上附加b,然後在a上附加「4」。

+0

謝謝!第二個例子非常好,但只要我給x(x =「new」)賦新值,old_x就不會更新,即使當我在x =「new」之後執行x <<「old」時 – 2015-02-08 19:42:53

+0

什麼是「 x =「new」'是創建一個新的字符串'「new」',併爲其分配'x'。它不會更改用於分配的字符串「x」的值。這就是爲什麼'old_x'不會改變,因爲它仍然被分配給舊的字符串。 – 2015-02-09 04:58:39

-4

如果< <代表+ =那麼爲什麼b是[sic]仍然是10而不是104?

因爲,當條件爲假時,無論結論是什麼,整個句子都是真實的。

P  Q  If P then Q 
false false true 
false true true 
true false false 
true true true 
+0

這是不正確的。這是因爲所涉及的運營商的性質。 – 2015-02-08 03:22:50

+0

@DavidHoelzer哪部分不正確?不清楚你的意思。 – sawa 2015-02-08 03:46:30

+0

「<<」不代表「+ =」。您的回答意味着您同意該聲明。 – 2015-02-08 12:49:44

0

如果< <代表+ =那麼爲什麼b仍然是10而不是104?

<< 「代表」 +=。他們是做不同事情的不同操作員。

a << b << c 

相同

a << b 
a << c 

<<修改字符串並返回,所以該子表達(a << b)第一評估爲a然後a << c繼續追加到a無需修改b

在另一方面:

a += b += c 

相同

b = b + c 
a = a + b