1

可能重复:
什么!在红宝石中是什么意思?

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

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

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

我真的用谷歌搜索过,但没有找到任何东西。

谁能给一个简短的解释?提前致谢。

4

3 回答 3

3

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

!!false # => false
!!nil # => false
!!true # => true
!!{} # => true
!![] # => true
!!1 # => true
!!0 # => true (Surprised? Only 'false' and 'nil' are false in Ruby!)
于 2012-09-20T02:36:33.840 回答
2

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

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

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

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

于 2012-09-20T02:39:22.650 回答
0

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

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

在 ruby​​ nil 中,false 被认为是 false,0、0.0 和其他对象被认为是 true

于 2012-09-20T02:38:35.170 回答