TypeError:使用Ruby &~操作符的参数类型错误



我尝试在我的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中的位,然后尝试在Fixnum上调用to_proc,因为应用了& (cast-as-block)运算符,然后最后尝试(如果没有抛出TypeError)将其作为块参数传递给User#flag方法。

相关内容

最新更新