什么是红宝石!!运营商?

时间:2012-09-20 02:34:29

标签: ruby

  

可能重复:
  What does !! mean in ruby?

我正在学习ruby / rails并找到了一个教程,其中包含以下代码示例:

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

我不知道!!做了什么,!!self做了什么。

我真的用Google搜索了,但没有找到任何东西。

有人可以简短解释一下吗?提前谢谢。

3 个答案:

答案 0 :(得分:3)

这是“not”运算符(!)重复两次,因此它的参数将被强制为其否定的布尔值,然后是相应的布尔值。基本上,它是一种将任何对象强制转换为布尔值的方法。

!!false # => false
!!nil # => false
!!true # => true
!!{} # => true
!![] # => true
!!1 # => true
!!0 # => true (Surprised? Only 'false' and 'nil' are false in Ruby!)

答案 1 :(得分:2)

通常用于将任意值强制转换为truefalse之一。 这对于在任意数字,字符串或潜在nil值之间进行转换通常很有用。

在您的示例中,这是非常低效的,因为加载整个模型只是为了丢弃。最好写成:

def role?(role)
  self.roles.count_by_name(role.to_s.camelize) > 0
end

该查询将返回一个用于比较目的的奇异值,其结果自动为布尔值。

答案 2 :(得分:0)

这确认操作将始终返回布尔值

!!1 #gives you true
!!nil #gives you false 

在ruby nil中,false被视为false,0,0.0和其他对象被认为是真的