ruby - 类型错误 : wrong argument type with Ruby &~ operator

标签 ruby bitwise-operators fixnum

我尝试比较我的 Ruby 应用程序中的标志。

我有这段代码:

if self.flag &~ flag == self.flag
        return false

但是它不会运行。我已将问题范围缩小到:

irb(main):020:0> my_user.flag
=> 1
irb(main):021:0> flag
=> 128
irb(main):022:0> my_user.flag.class
=> Fixnum
irb(main):023:0> flag.class
=> Fixnum
irb(main):024:0> my_user.flag &~ flag
TypeError: wrong argument type Fixnum (expected Proc)

这真的很令人不安,因为它是这样工作的:

irb(main):025:0> 1 &~ 128
=> 1

最佳答案

1 &~ 128my_user.flag &~ flag 之间的区别是第二个表达式涉及点方法调用。这改变了后续标记的解释方式。

试试这个:

# works
my_user.flag() &~ flag

# also works
(my_user.flag) &~ flag

# best
my_user.flag & ~flag

您会发现它有效。这是因为添加 () 或移动 ~ 会更改操作顺序,使其更符合您的预期。

您正在使用的原始方法调用实际上被 Ruby 解释为:

# bad
my_user.flag(&(~flag))

此操作顺序首先通过应用 ~ 运算符翻转 flag 中的位,然后尝试对生成的 调用 to_proc >Fixnum 因为应用了 & (cast-as-block) 运算符,然后最终尝试(如果没有抛出 TypeError)通过它作为 User#flag 方法的 block 参数。

关于ruby - 类型错误 : wrong argument type with Ruby &~ operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092811/

相关文章:

.net - Ansicon 和 cucumber : 'Ruby interpreter (CUI) 1.9.3p194 [1386-mingw] has stopped working'

ruby-on-rails - 宽松模式下的流动性提升语法错误

sql - 为什么 SQL Server 中 SELECT 2^3 返回 1?

c - 这是 + 运算符在 C 中的实现方式吗?

java - java中 '>>'和 '/'、移位和除法有什么区别

ruby - Ruby 中是否有任何优雅的方法将数字转换为数字数组

arrays - Fixnum 与 nil 的比较失败 - 回文程序 Ruby

ruby-on-rails - 如何在 Rails 中使用 Ruby 库?

ruby-on-rails - 仅使用 Rails pluralize helper 将强样式应用于数字

ruby - 我如何在 Ruby 中始终向下舍入数字?