2011-09-26 158 views
10

我碰到红宝石升技的例子你为什么要用!!运营商

def role?(role) 
    return !!self.roles.find_by_name(role.to_s.camelize) 
end 

来到你为什么会用不完!!?是不是相同

return self.roles.find_by_name(role.to_s.camelize) 

是否添加双重感叹号添加评价的东西?

+0

对于文化,请注意'!!'运算符通常称为“双重运算符”。 –

+0

另请注意,'return'和'self.'在这里都是多余的。 –

+0

@Kernald - 嗯,没有!运营商。 – steenslag

回答

16

如果您只需要布尔值而不是对象,则可以使用它。除boolean false之外的任何非零对象都代表true,但是,您也会返回数据。通过双重否定它,你返回一个合适的布尔值。

5

这是一个双重否定,导致一个布尔值:

irb(main):016:0> !1 
=> false 
irb(main):013:0> !0 
=> false 
irb(main):014:0> !nil 
=> true 
irb(main):015:0> !!nil 
=> false 
0

是在你的情况,你可以肯定的是,函数返回只有真或假。如果你会忽略!你会返回一个角色列表

7

免责声明:不是一个红宝石程序员,但刺伤了这一点。

!!,double bang或“not not”,可能会将该值转换为布尔值。其中一个!返回布尔值相反的值,之后的另一个值将会将其翻转为正常的布尔值。

0

用这个小动作,你得到一个表达式的实际布尔值,例如:

!! 3 
=> true 

!! nil 
=> false 

!! 0 
=> true 

在Ruby中任何不为零还是假的,是真的!

在您的示例代码这一招可以确保您永远不会返回别的
但真或假

,如果您省略了! ,您将返回角色列表,或者无