我正在学习ruby / rails并找到了一个教程,其中包含以下代码示例:
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
我不知道!!
做了什么,!!self
做了什么。
我真的用Google搜索了,但没有找到任何东西。
有人可以简短解释一下吗?提前谢谢。
答案 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)
通常用于将任意值强制转换为true
或false
之一。
这对于在任意数字,字符串或潜在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和其他对象被认为是真的