2013-02-22 57 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一个实例,并且检查将打印“耶”。没有什么可以在这里做。