说我有以下内容:
class Foo
def inspect
false
end
def ==(other)
false == other
end
end
foo = Foo.new # => false
foo # => false
foo == false # => true
foo == true # => false
Run Code Online (Sandbox Code Playgroud)
然而
if foo then 'hi' end
# => 'hi'
Run Code Online (Sandbox Code Playgroud)
我所期待的是
if false then 'hi' end
# => nil
Run Code Online (Sandbox Code Playgroud)
我期待foo评估,false但事实并非如此.如何if评估foo,为什么不评估false?
Ruby中只有两个对象被认为是"假的":( falseof FalseClass)和nil(of NilClass).您不能使另一个对象模仿其中一个,因为Ruby运行时会检查这两个具体实例.
在您的示例中,您有一个Foo类的实例.它不是false或nil,因此它被认为是"truthy".没有办法让它评估为虚假价值.