2012-09-20 68 views
1

可能重複:
What does !! mean in ruby?什麼是紅寶石!運營商?

我正在學習的Ruby/Rails,發現下面的代碼示例教程:

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

我沒有任何想法是什麼!!做的,!!self做。

我真的在Google上搜索,但沒有找到任何東西。

任何人都可以給出一個簡短的解釋嗎?提前致謝。

+1

http://symbolhound.com/?q=%21%21+ruby –

回答

3

這是重複兩次的「not」運算符(!),所以它的參數將被強制爲其否定的布爾值,然後是其相應的布爾值。基本上,這是將任何對象強制爲其布爾值的一種方式。

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

這證實了該操作將始終返回boolena值

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

在紅寶石零,假的則認爲是假的,0,0.0和其他物體都認爲是真

2

這是通常用於將任意值強制轉換爲truefalse之一。 這通常用於在任意數字,字符串或潛在的值之間轉換。

在你的例子中,這是非常低效的,因爲整個模型只能被加載而被丟棄。它會寫得更好:

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

該查詢將返回一個用於比較目的的單數值,其結果自動爲布爾值。