2013-02-22 63 views
0

我正在嘗試使類MyClass的實例評估爲虛假值。所以我試圖覆蓋所有我認爲能夠使MyClass充當nil的方法。我:在評估條件中的真實性時,Ruby如何評估對象的類別?

a = MyClass.new 
a.nil? #=> true 
a.class #=> NilClass 
a == nil #=> true 
a.eql? nil #=> true 
a.equal? nil #=> true 
a.instance_of? NilClass #=> true 
a.kind_of? NilClass #=> true 
a.is_a? NilClass #=> true 

我甚

nil == a #=> true 
nil.eql? a #=> true 
nil.equal? a #=> true 

最後我想

a.__id__ #=> 4 
nil.__id__ #=> 4 
a.object_id #=> 4 
nil.object_id #=> 4 

但儘管如此,a將始終評估爲true。所以我想知道Ruby是如何檢查anil還是false。我想這是開發人員無法訪問的東西。

這不是爲了解決實際問題,我只是想知道它是否確實無法完成。我知道這會破壞Ruby的「一切都是真實的 - 除了虛假和零」--idiom,它很可能是純粹的邪惡黑客。

+0

編號nikifi想知道這個習語的好處。我想知道,它是如何執行的,以及是否有辦法干擾api。 – Conkerchen 2013-02-22 17:03:07

回答

1

只有兩個評估虛假的物體。 Ruby只是檢查對象是否是其中的一個。期。

請注意,OO的基礎之一是模擬:一個對象可以模擬另一個對象。這裏不是這樣:模擬nilfalse是不可能的。這是Ruby違反OO的煩人案例之一,與Object#equal?非常相似。

1

Ruby會檢查表達式的實際

class Foo; end 

f = Foo.new 
f # => #<Foo:0x007ff3da88b348> 

if f 
    puts 'yay' 
else 
    puts 'nay' 
end 

無論你嘗試重新定義Foo類的什麼方法,f仍將是Foo一個實例,並且檢查將打印「耶」。沒有什麼可以在這裏做。