5

我尝试比较我的 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
4

1 回答 1

4

1 &~ 128和之间的区别在于my_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这种操作顺序首先通过应用运算符来翻转位,然后由于应用了(cast-as-block) 运算符而~尝试调用to_proc结果,然后最后尝试(如果没有抛出 a )传递它作为方法的块参数。Fixnum&TypeErrorUser#flag

于 2015-08-19T10:29:35.107 回答