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 文档中找不到它的位置。
- 哪里有这方面的文档?
- 它存在于哪个 class 或模块中?
- 为什么只有先将它分配给一个变量才有效?
谢谢!
这称为缩写赋值,在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
这是几个问题合二为一的问题。我看到最近使用的方法“<<=”。我能够拼凑出 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 文档中找不到它的位置。
- 哪里有这方面的文档?
- 它存在于哪个 class 或模块中?
- 为什么只有先将它分配给一个变量才有效?
谢谢!
这称为缩写赋值,在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