我在一个例子中遇到了红宝石
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 :(得分: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