0

私は最近、Ruby の暗黙的コンテキストに関する興味深い記事を見つけました。selfRuby は(デフォルトのメソッド receiver ) だけでなく、現在のクラス(デフォルトの defineeまたはとも呼ばれます)への参照も保持していることを理解しました`klass'

記事から、定義が現在のクラスclassの両方selfを定義されているクラスに設定すると仮定するのは正しいはずです。通常のメソッド定義 (つまり、シングルトン メソッドを定義するためにドット構文を使用しない)を考慮する限り、 を使用したメソッド定義のコンテキストでは、受信オブジェクトを参照し、現在のクラスは変更されません。defself

定義にドット構文を考慮しないことが安全だと考える理由は、Ruby がクラスの固有クラスを開く明示的な方法も提供しているからです。私が最も興味を持っているのは、固有クラスを開くときにこれら 2 つの暗黙のコンテキストがどのように管理されるかを理解することです。 .

def 固有クラスを開くためのよく知られた構文で使用します。

class << A
  p self

  def foo
    # ...
  end
end

foo を のシングルトン メソッドAつまり固有クラスのインスタンス メソッド(be it A') として定義します。このコードは も出力#<Class:A>するので、<<構文がself現在のクラスの両方を に設定すると言うのは正しいA'ですか?

4

2 に答える 2

1

実際、あなたが書いたものは、次のように書いたものとまったく同じです。

class A
  class << self
    def foo
      #...
    end
  end
end

class << self 構文は、定義のブロックが続くことを示しており、これは << に渡されたオブジェクトの固有クラスに直行します。はい、クラスではなくオブジェクトと言いました。これを試してください(上記のクラス定義があれば):

a = A.new
class << a
  def foo2
  end
end
a.singleton_methods
b = A.new
b.singleton_methods

これは、この場合、オブジェクト a の固有クラスでメソッド foo2 を定義していることを意味します。しかし、これはオブジェクト自体の固有クラスであり、クラスではありません。したがって、同じクラスの他のオブジェクトは、この foo2 定義を共有しません。

これはどういう意味ですか?Ruby は純粋なオブジェクト指向言語です (またはそう主張しています)。すべてがオブジェクトです。ユーザーが定義したクラスのオブジェクトはオブジェクトです。ユーザーが定義したクラスもオブジェクトです。クラス型。Object から継承します。Ruby では、すべてのオブジェクトに固有クラスがあります。実際、「クラス メソッド」の定義は、その概念の解釈にすぎません。「クラス メソッド」は実際にはクラス メソッドではなく、クラスの固有クラスで定義されたメソッドです。したがって、「クラス メソッド」を呼び出すときは、実際にはオブジェクト メソッドを呼び出していることになります。このオブジェクトはたまたまあなたが定義したクラスです。固有クラス メソッドをどのように定義しますか? まさに class << self 構文です。このコンテキストでの「自己」は、クラス << に引数として渡したものです。

于 2012-11-04T13:41:10.453 に答える
1

はい、実際に A' の制御下でブロックを開きます。また、A' の class_eval のように機能するとも言えます。

于 2012-11-04T13:18:17.017 に答える