-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

メソッドは、Rubyのクラスではなくwtf、クラス内に格納されます。WClass

継承と考えてください。継承クラスでメソッドを定義すると、継承クラスでは使用できなくなります。同様に、クラスでメソッドを定義すると、そのメソッドはWクラスで使用できなくなりますClass。継承クラスにメソッドを追加しても、継承クラスには影響しません。

Rubyの内部Classクラスをいじることはお勧めしませんが、モンキーパッチを適用することでメソッドを追加できます。

class Class
  def self.wtf
     "wtf"
  end
end

ここClass.methods.grep /wtf/で、追加されたメソッドが返されます。

于 2012-11-24T08:43:55.917 に答える