0

最近、Ruby のクラスの詳細を調べていて、クラス定義に混乱していました。

Ruby では、クラス定義は次のようになります。

class A
    def self.my_method
    end
end

そしてそれはと同じです

class A
    class << self
        def my_method
        end
    end
end

それから私は混乱しました。最初のケースでは、self は現在使用中のオブジェクトへのポインターと見なすことができ、コンテキストの現在のクラスは A です。メソッドの検索は再帰的に行われます。しかし、私の質問は、defは何をするのでしょうか? 現在のオブジェクトとコンテキストをどのように変更しますか? 問題は2番目のケースでも同じです。class << selfのような記述は、現在のオブジェクトとコンテキストをどのように変更しますか?

そして別の質問です。私の知る限り、すべての Class オブジェクトは fly-weight のような設計パターンに従っています。それらは同じ Class オブジェクトを同じ定義で共有しているためです。その後、固有クラスが混乱しました。固有クラスの def は実際には Class オブジェクトでメソッドを定義しているため、「def self.*」とどのように関連付けることができるでしょうか。

見た目が複雑すぎて、Ruby の設計詳細が必要なのかもしれません。

4

1 に答える 1

4
class A
  # self here is A
  def aa
    # self here is the instance of A who called this method
  end
  class << self
    # self is the eigenclass of A, a pseudo-class to store methods to a object.
    # Any object can have an eigenclass.
    def aa
      # self is the pseudo-instance of the eigenclass, self is A.
    end
  end
end

これは同じです:

class A
  def self.aa
  end
end

この:

class << A
  def aa
  end
end

そしてこれも:

def A.aa
end

あなたは何でも固有クラスを開くことができます:

hello = "hello"
class << hello
  def world
    self << " world"
  end
end
hello.world #=> "hello world"
"my".world  #=> NoMethodError

固有クラスは実際にはClassのインスタンスであり、独自の固有クラスもあります。

「混乱しすぎるように思われる場合は、Classがオブジェクトであり、Objectがクラスであることを覚えておいてください。」

于 2011-10-27T18:04:37.533 に答える