2013-06-25 79 views
2

說我有以下幾點:如何被解析的對象 「如果」

class Foo 
    def inspect 
    false 
    end 

    def ==(other) 
    false == other 
    end 
end 

foo = Foo.new # => false 
foo   # => false 
foo == false # => true 
foo == true # => false 

然而

if foo then 'hi' end 
# => 'hi' 

我所期待的是

if false then 'hi' end 
# => nil 

我期待foo評估作爲false但它不是。 if如何評估foo以及爲什麼不是false

回答

7

Ruby中只有兩個對象被認爲是「falsy」:false(的FalseClass)和nil(的NilClass)。你不能讓另一個對象模仿其中的一個,因爲Ruby運行時會檢查這兩個具體實例。

在你的例子中,你有一個Foo類的實例。它不是falsenil,所以它被認爲是「truthy」。沒有辦法讓它評價爲虛假價值。

+2

再次,塞爾吉奧是第一個提供了一個很好的答案。讓我只是添加[鏈接到Avdi着名文章處理同一問題](http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/)。儘管如此,我必須說,我反對'虛無'。我認爲Ruby中的'nil'對於一個正確實現的空對象模式來說是一個蹩腳的ersatz。但今天糾正已經太遲了。 –

+2

@BorisStitnicky:你可以派紅寶石:) –

+2

不是現在,我忙於在Ruby中重寫SBML。我滿足了自己[與kibbitzing: - ]](http://bugs.ruby-lang.org/issues/8365) –