一个对象(某个类的实例)的方法与Ruby中它的类的实例方法相同吗?

时间:2012-11-24 08:04:53

标签: ruby metaprogramming

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

class W;end

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

# Also

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

WClass的一个实例。但如果我重新打开W并为其定义一个新方法,那就不要混淆了。

class W
  def self.foo
     "bar"
  end
end

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

class Class
  def self.wtf
     "wtf"
  end
end

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