2012-01-26 89 views
0

如果你這樣做:在Ruby中,爲什麼!nil return => true?

$ nil 
    => nil 

但是,如果你這樣做:

$ !nil 
    => true 

爲什麼爲零真的嗎?

+1

它還能是什麼? 「真」是非僞造價值的最合理的候選者。它來自定義。 – sawa

+2

你期望它做什麼? –

回答

13

當您在Ruby中的對象上使用布爾運算符(如!)時,必須先將該對象在幕後轉換爲布爾值(truefalse)。在紅寶石每個對象可以是「truthy」或「falsy」和Ruby的實現者已選擇nil是falsy,所以!nil相當於!false,其評估對true

+3

當用作表達式時,可能會說它「評估爲真」或「評估爲假」。正是這種行爲允許'!!'被用來把東西渲染成布爾值。 '!nil'是'true','!! nil'是'false'。 – tadman

1

因爲在一般情況下,比較,無被視爲,所以,如果你這樣做:

if something_that_returns_nil 
    puts "did not return nil" 
else 
    puts "returned nil" 

你希望它會產生相反的行爲,如果它是:

if !something_that_returns_nil 
    puts "did return nil" 
else 
    puts "did not return nil" 

所以,當你「反轉」無它變爲假,因爲沒有表示not_being_nil的特定對象(如不是零就是在Ruby中的任意值)。

4

!運算符是一元布爾非。如果其操作數是nilfalse,它將返回true。否則它將返回false

!nil # => true 
!false # => true 
!Object.new # => false 

在布爾表達式紅寶石始終考慮nilfalsefalse和所有其餘的值true

相關問題