Ruby 二元法<<=

Ruby binary method <<=

这是几个问题合二为一的问题。我看到最近使用的方法“<<=”。我能够拼凑出 is 的作用,但没有其他任何东西。

$ 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  
     ^

我搜索了几个小时,但在 ruby 文档中找不到它的位置。

谢谢!

这称为缩写赋值,在ISO Ruby Language Specification的第11.4.2.3节缩写赋值中有介绍;具体来说,它是一个缩写变量赋值 (§11.4.2.3.2)。

一个缩写变量赋值的计算(大致)如下:

a ω= b

相同
a = a ω b

其中 ω 是任意非等式 Ruby 运算符(&&||&|^, +, -, *, /, **, %, <<, >>).

注意:这个简单的翻译只适用于缩写变量赋值。它适用于缩写索引赋值a[b] ω= b)或缩写方法赋值a.b ω= c).

  • Where is there documentation for this?

虽然 ISO Ruby 语言规范仅涵盖 Ruby 1.8 和 Ruby 1.9 交集的一小部分,但缩写赋值 覆盖在那里。

它们也包含在 Ruby RDocs under syntax/assignment.rdoc

  • What class or module does this live in?

None。作业是一种语言功能,而不是库功能。

  • Why does is only work if you assign it to a variable first?

我不太清楚你的意思。它工作得很好,没有先分配给一个变量:

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

a <<= a
#=> :haha