0

「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メソッドが現在何に属しているかということです。それはメタクラスではありません。それで、それは何ですか?

4

3 に答える 3

0

メソッドはまだのメタクラスにshout属しています。メソッドからfoo常に戻ることを選択したため、アクセスできません。Hashのメソッド定義はfoo.shout、メソッドのセマンティクスの影響を受けませんmetaclass

于 2014-03-24T18:02:52.823 に答える