我正在尝试将类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如何检查a
是nil
还是false
。我想这是开发人员无法访问的内容。
这不是为了解决实际问题,我只是想知道它是否确实无法完成。我知道这会破坏Ruby的“一切都是真的 - 除了 - 假 - 并且没有”这个 - 而且它很可能是一个纯粹邪恶的黑客。
答案 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的基础之一是模拟:对象可以模拟另一个对象。这不是真的:模拟nil
或false
是不可能的。这是Ruby违反OO的烦人案例之一,与Object#equal?
非常相似。