私は最近、Ruby の暗黙的コンテキストに関する興味深い記事を見つけました。self
Ruby は(デフォルトのメソッド receiver ) だけでなく、現在のクラス(デフォルトの defineeまたはとも呼ばれます)への参照も保持していることを理解しました`klass'
。
記事から、定義が現在のクラスclass
の両方self
を定義されているクラスに設定すると仮定するのは正しいはずです。通常のメソッド定義 (つまり、シングルトン メソッドを定義するためにドット構文を使用しない)を考慮する限り、 を使用したメソッド定義のコンテキストでは、受信オブジェクトを参照し、現在のクラスは変更されません。def
self
定義にドット構文を考慮しないことが安全だと考える理由は、Ruby がクラスの固有クラスを開く明示的な方法も提供しているからです。私が最も興味を持っているのは、固有クラスを開くときにこれら 2 つの暗黙のコンテキストがどのように管理されるかを理解することです。 .
def
固有クラスを開くためのよく知られた構文で使用します。
class << A
p self
def foo
# ...
end
end
foo を のシングルトン メソッド、A
つまり固有クラスのインスタンス メソッド(be it A'
) として定義します。このコードは も出力#<Class:A>
するので、<<
構文がself
と現在のクラスの両方を に設定すると言うのは正しいA'
ですか?