Mat*_*Mat 5 ruby bitwise-operators fixnum
我尝试比较我的Ruby应用程序中的标志.
我有这个代码:
if self.flag &~ flag == self.flag
return false
Run Code Online (Sandbox Code Playgroud)
但它不会运行.我把问题缩小到了这个范围:
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)
Run Code Online (Sandbox Code Playgroud)
这真是令人不安,因为它的工作原理如下:
irb(main):025:0> 1 &~ 128
=> 1
Run Code Online (Sandbox Code Playgroud)
1 &~ 128和之间的区别my_user.flag &~ flag在于第二个表达式涉及点方法调用。这改变了后续标记的解释方式。
尝试这个:
# works
my_user.flag() &~ flag
# also works
(my_user.flag) &~ flag
# best
my_user.flag & ~flag
Run Code Online (Sandbox Code Playgroud)
你会发现它有效。这是因为添加()或移动~会更改操作顺序,使其更符合您的预期。
您使用的原始方法调用实际上被 Ruby 解释为:
# bad
my_user.flag(&(~flag))
Run Code Online (Sandbox Code Playgroud)
此操作顺序首先flag通过应用运算符翻转位~,然后由于应用(强制转换为块)运算符而尝试to_proc调用结果,然后最后尝试(如果没有抛出)将其传递作为该方法的块参数。Fixnum&TypeErrorUser#flag
| 归档时间: |
|
| 查看次数: |
779 次 |
| 最近记录: |