2016-10-31 25 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! –

相关问题