-2

在完成元编程 Ruby 中的“对象模型”一章后,我感到很困惑。对象(某个类的实例)的方法是否与 Ruby 中其类的实例方法相同?听起来是真的。因为我们知道对象的方法存储在它的类中。

class W;end

W.methods == Class.instance_methods # => true

# Also

String.instance_methods == "abc".methods # => true

W是 的一个实例Class。但如果我重新打开W并为它定义一个新方法,那就是混淆了。

class W
  def self.foo
     "bar"
  end
end

W.methods == Class.instance_methods  # => false

W是 的实例ClassW的方法是Class的实例方法。但如果:foo没有存储在 中Class,那么它存储在哪里?

4

1 回答 1

0

该方法wtf存储在W类中,而不是 Ruby 的Class类中。

将其视为继承,当您在继承类中定义方法时,它在继承类中不可用。同样,当您在类中定义方法时,该方法在W类中不可用Class。在继承类中添加方法时不会影响继承类。

虽然我不建议弄乱 Ruby 的内部 Class 类,但您可以通过猴子修补它来添加方法:

class Class
  def self.wtf
     "wtf"
  end
end

现在Class.methods.grep /wtf/将返回您添加的方法。

于 2012-11-24T08:43:55.917 回答