2016-10-31 72 views
1

這是幾個問題包裝在一個。我看到最近使用的方法「< < =」。我能夠將所做的事情拼湊在一起,但沒有其他任何事情。Ruby二進制方法<< =

$ dec = 2 
$ dec <<= 1 
=> 4 
$ dec 
=> 4 
$ dec <<= 2 
=> 16 

我認爲這是基本上是總和加上乘以一個快捷方式在未來第n個位置的二進制:

$ a = 2 * 2 ** 1 
=> 4 
$ a = a * 2 ** 2 
=> 16 

,如果你嘗試在一個Fixnum本身

$ 4 <<= 1 
=> SyntaxError: unexpected tOP_ASGN, expecting end-of-input 
1 <<= 1 
    ^
它不工作

我搜索了幾個小時,無法找到它在紅寶石文檔中的位置。

  • 這是哪裏的文檔?
  • 這個活生生的類或模塊是什麼?
  • 爲什麼僅當您首先將其分配給變量時才起作用?

謝謝!

+1

'a << = b'是'a = a << b'的簡寫形式。 – Michas

+0

@Michas有你的答案。它類似於'+ =','|| ='等等。 –

回答

2

這被稱爲縮寫分配和覆蓋在第11.4.2.3 縮分配的ISO Ruby Language Specification;具體來說它是一個簡稱變量賦值(第11.4.2.3.2節)。

縮寫的變量賦值進行評估(大致)是這樣的:

a ω= b 

相同

a = a ω b 

其中ω是任意非平等紅寶石運算符(&&||&|,^,+,-,*, /**,%,<<,>>)。

注意:這種簡單的翻譯僅適用於縮寫變量賦值。它適用於簡稱索引分配a[b] ω= b)或簡寫方法分配a.b ω= c)。

  • 這是哪裏的文檔?

雖然ISO紅寶石語言規範僅覆蓋紅寶石1.8和Ruby 1.9的交叉點的一小部分,簡寫分配覆蓋那裏。

它們也涵蓋在Ruby RDocssyntax/assignment.rdoc之下。

  • 住在哪一類或哪個模塊?

無。分配是一種語言功能,而不是庫功能。

  • 爲什麼只有在首先將它分配給變量時纔有效?

我不確定你的意思。它不需要首先分配變量就可以很好地工作:

class NilClass; def <<(*) :haha end end 

a <<= a 
#=> :haha 
+0

當我像這樣使用它時,它返回了一個錯誤消息:'1 << = 1' 哪個與你顯示的是合理的,因爲我將嘗試爲fixnum分配一個值。 '1 = 1 << 1'這是正確的嗎? –

+0

啊,是的。那是對的。所以,你*不需要將它分配給變量* first *,但是你*需要*將它分配給一個變量*。如果這是有道理的。 –

+0

它的確如此。謝謝JörgW Mittag! –

相關問題