你为什么要用!!操作者

时间:2011-09-26 21:32:06

标签: ruby operators

我在一个例子中遇到了红宝石

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

为什么要使用!!?它与

不一样
 return self.roles.find_by_name(role.to_s.camelize)

添加双重感叹号是否会为评估添加一些内容?

5 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:7)

免责声明:不是红宝石程序员,而是对此进行了抨击。

!!,double bang或“not not”,可能会将值转换为布尔值。一个!返回布尔对面,然后另一个bang将其翻转为正常的布尔值。

答案 2 :(得分: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

答案 3 :(得分:0)

是的,在您的情况下,您可以确定该函数仅返回true或false。如果你省略!!你会返回一个角色列表

答案 4 :(得分:0)

通过这个小技巧,您可以获得表达式的实际布尔值,例如:

!! 3 
=> true

!! nil
 => false 

!! 0
 => true 

在Ruby中任何不是零或假的东西都是真的!

在你的示例代码中,这个技巧确保你永远不会返回任何其他内容 但是真或假

如果你省略!! ,你会返回角色列表,或者nil