TypeError: wrong argument type with Ruby &~ operator

TypeError: wrong argument type with Ruby &~ operator

我尝试比较我的 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 方法。