在评估条件中的真实性时,Ruby如何评估对象的类?

时间:2013-02-22 16:52:37

标签: ruby metaprogramming evaluation

我正在尝试将类MyClass的实例计算为虚假值。所以我试图覆盖我能想到的所有方法,使MyClass充当nil。我得到了:

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的“一切都是真的 - 除了 - 假 - 并且没有”这个 - 而且它很可能是一个纯粹邪恶的黑客。

2 个答案:

答案 0 :(得分:1)

Ruby检查表达式的实际

class Foo; end

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

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

无论您尝试在Foo课程上重新定义哪种方法,f仍然是Foo的实例,该检查将打印为“yay”。你无能为力。

答案 1 :(得分:1)

只有两个评估假的对象。 Ruby只是检查对象是否是这两个中的一个。周期。

请注意,OO的基础之一是模拟:对象可以模拟另一个对象。这不是真的:模拟nilfalse是不可能的。这是Ruby违反OO的烦人案例之一,与Object#equal?非常相似。