【问题标题】:Ruby binary method <<= [closed]Ruby二进制方法<<= [关闭]
【发布时间】:2016-10-31 08:00:27
【问题描述】:

这是一个包含几个问题的问题。我看到最近使用的方法“

$ 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​​ 文档中找不到它的位置。

  • 哪里有这方面的文档?
  • 这存在于哪个类或模块中?
  • 为什么只有先将其分配给变量才有效?

谢谢!

【问题讨论】:

  • a &lt;&lt;= ba = a &lt;&lt; b 的缩写形式。
  • @Michas 有你的答案。类似于+=||=等。

标签: ruby binary documentation


【解决方案1】:

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

一个缩写的变量赋值是这样计算的(大致):

a ω= b

一样
a = a ω b

其中 ω 是任意非等式 Ruby 运算符(&amp;&amp;||&amp;|^+-*、@9876 @、**%&lt;&lt;&gt;&gt;)。

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

  • 哪里有这方面的文档?

虽然 ISO Ruby 语言规范仅涵盖 Ruby 1.8 和 Ruby 1.9 交集的一小部分,但其中涵盖了缩写赋值

它们也包含在syntax/assignment.rdoc 下的Ruby RDocs 中。

  • 它存在于哪个类或模块中?

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

  • 为什么只有先将其分配给变量才有效?

我不确定你的意思。无需先分配变量,它就可以正常工作:

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

a <<= a
#=> :haha

【讨论】:

  • 当我像这样使用它时,它返回了一条错误消息:1 &lt;&lt;= 1 你所展示的内容是有道理的,因为我试图为一个固定编号分配一个值。 1 = 1 &lt;&lt; 1 对吗?
  • 啊,是的。那是对的。因此,您不需要将其分配给变量first,但您确实需要将其分配给变量at全部。如果这是有道理的。
  • 确实如此。谢谢 Jörg W Mittag!
猜你喜欢
  • 2017-01-26
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多