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