Ruby 中的 if 语句是否调用特定的对象方法?

Does an if statement in Ruby call a particular object method?

也许我不太了解一些基本的东西,但我想知道在为 if 语句评估对象时是否调用了对象的某些特定方法?

所以,在下面...

my_object = MyObject.new

if !my_object
  puts 'Hello, world!'
end

class MyObject
  def ___
    return false
  end
end

...是否有一些方法 ___ 可以在 if 调用的对象中定义,以便我可以确定条件的结果? (在上面,输出将是 'Hello, world!')

或者有没有其他方法可以根据 MyObject 的定义控制它在 if 语句中的计算方式?

谢谢。

如果变量不是 nilfalse,则 if 应该计算为真(如果变量未定义,将会出错)。我不确定是否有办法覆盖定义为 return nil 或 false 的对象(这不会让大多数 Ruby 程序员感到困惑)但我很想听听其他人的意见.

你可以做的是将一个方法添加到 return 一个 nilfalse 值并改用它:

class MyObject
  def foo?
    false
  end
end

obj = MyObject.new

if obj.foo?
  puts "true"
else
  puts "false"
end

更新:您可以将 new 方法重写为 return 布尔值,而不是对象。

class MyObject
  attr_reader :var

  def initialize(*args)
    args.each do |a|
      puts a
    end
  end

  def self.new(*args, &block)
    super
    false
  end
end

my_object = MyObject.new(:a, :b)

if !my_object
  puts 'Hello, world!'
end


my_object = MyObject.new

if !my_object
  puts 'Hello, world!'
end

这可能会有很多副作用,因为您基本上已经将对象的实例转换为布尔值。虽然这可能是一个有趣的探索,但我可能会坚持改变我的分配或做 defined?is_a?nil? 检查或其他。

is there some method ___ that I could define within the object that would called by if, such that I can determine the result of the conditional?

不,不幸的是没有。不幸的是,这是 Ruby 不是面向对象的情况之一。

Ruby 中只有两个虚假对象:false(很明显)和 nil。其他一切都是真实的,包括在其他一些语言中被认为是虚假的对象,例如整数 0、浮点数 0.0、空字符串 ''、空数组 [] 和空散列 {}.

面向对象的基本支柱之一是对象可以相互模拟。事实上,有些人认为这是 面向对象的定义特征。然而,无法在 Ruby.

中模拟 falsenil

(in the above, the output would be 'Hello, world!')

在这种特殊情况下,您可以通过覆盖 ! 来实现这一点,但这将是作弊,因为它不会影响对象本身的真值:

class MyObject
  def !
    true
  end
end