「rubymonk」やその他の ruby リソースでは、オブジェクトに singleton メソッドを定義すると、内部では Ruby がこの新しいメソッドをオブジェクトのメタクラスに追加していると述べられています。右?また、メタクラスにアクセスするためのトリックがあり、それは次のとおりです。
class Object
def metaclass
class << self
self
end
end
end
foo = "I'm a string object"
def foo.shout
puts self.upcase
end
foo.shout
p foo.metaclass.class
p foo.class.instance_methods.include? :shout
p foo.metaclass.instance_methods.include? :shout
結果は次のとおりです。
I'M A STRING OBJECT
Class
false
true
そしてすべてが大丈夫です。しかし、メタクラス メソッドをHash
代わりにreturn に変更するとどうなるself
でしょうか?
class Object
def metaclass
class << self
Hash
end
end
end
次に、次のことを確認します。
p foo.class.instance_methods.include? :shout
p foo.metaclass.instance_methods.include? :shout
p String.instance_methods.include? :shout
p Object.instance_methods.include? :shout
p Hash.instance_methods.include? :shout
ええ、それらはすべて偽です。
false
false
false
false
false
問題は、shout
メソッドが現在何に属しているかということです。それはメタクラスではありません。それで、それは何ですか?