TypeError:使用Ruby&〜运算符的错误参数类型

时间:2015-08-19 10:23:34

标签: ruby bitwise-operators fixnum

我尝试比较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 个答案:

答案 0 :(得分:4)

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,因为应用了& TypeError(cast-as-block)运算符,然后最后尝试(没有抛出User#flag)将其作为块参数传递给$date= date('d-m-Y'); SELECT SQL_CALC_FOUND_ROWS t.* ,count(*) as count FROM( SELECT client_id,clientplan_id as sl,client_name,plan_name,DATE_FORMAT(clientplan_startdate,'%d-%m-%Y') as clientplan_startdate,DATE_FORMAT(clientplan_enddate,'%d-%m-%Y') as clientplan_enddate,server_name,clientplan_id FROM clientplan join client on client.client_id=clientplan.clientplan_clientid left join plan on clientplan.clientplan_planid=plan.plan_id left join server on client.client_server=server.server_id WHERE client_status!=0 AND clientplan_status!=2 ORDER BY clientplan_id desc)as t GROUP BY t.client_id HAVING clientplan_enddate='$date' ORDER BY client_name asc LIMIT 0, 1000 方法。