2011-09-26 63 views
10

我碰到紅寶石升技的例子你爲什麼要用!!運營商

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

對於文化,請注意'!!'運算符通常稱爲「雙重運算符」。 –

+0

另請注意,'return'和'self.'在這裏都是多餘的。 –

+0

@Kernald - 嗯,沒有!運營商。 – steenslag

回答

16

如果您只需要布爾值而不是對象,則可以使用它。除boolean false之外的任何非零對象都代表true,但是,您也會返回數據。通過雙重否定它,你返回一個合適的布爾值。

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 
0

是在你的情況,你可以肯定的是,函數返回只有真或假。如果你會忽略!你會返回一個角色列表

7

免責聲明:不是一個紅寶石程序員,但刺傷了這一點。

!!,double bang或「not not」,可能會將該值轉換爲布爾值。其中一個!返回布爾值相反的值,之後的另一個值將會將其翻轉爲正常的布爾值。

0

用這個小動作,你得到一個表達式的實際布爾值,例如:

!! 3 
=> true 

!! nil 
=> false 

!! 0 
=> true 

在Ruby中任何不爲零還是假的,是真的!

在您的示例代碼這一招可以確保您永遠不會返回別的
但真或假

,如果您省略了! ,您將返回角色列表,或者無