如何用"if"解释对象

Dty*_*Dty 2 ruby

说我有以下内容:

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

Ser*_*sev 7

Ruby中只有两个对象被认为是"假的":( falseof FalseClass)和nil(of NilClass).您不能使另一个对象模仿其中一个,因为Ruby运行时会检查这两个具体实例.

在您的示例中,您有一个Foo类的实例.它不是falsenil,因此它被认为是"truthy".没有办法让它评估为虚假价值.

  • 塞尔吉奥再次提供了一个很好的答案.让我添加[链接到Avdi关于同一问题的着名文章](http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/).虽然,我必须说,我反对"零"是假的.我认为Ruby中的`nil`对于正确实现的null对象模式来说是一个蹩脚的ersatz.但是现在纠正已经太晚了. (2认同)
  • @BorisStitnicky:你可以分叉红宝石:) (2认同)
  • 不是现在,我太忙于在Ruby中重写SBML.我满足自己[与kibbitzing: - )](http://bugs.ruby-lang.org/issues/8365) (2认同)