問題タブ [eigenclass]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - Rubyでのクラス定義について
最近、Ruby のクラスの詳細を調べていて、クラス定義に混乱していました。
Ruby では、クラス定義は次のようになります。
そしてそれはと同じです
それから私は混乱しました。最初のケースでは、self は現在使用中のオブジェクトへのポインターと見なすことができ、コンテキストの現在のクラスは A です。メソッドの検索は再帰的に行われます。しかし、私の質問は、defは何をするのでしょうか? 現在のオブジェクトとコンテキストをどのように変更しますか? 問題は2番目のケースでも同じです。class << selfのような記述は、現在のオブジェクトとコンテキストをどのように変更しますか?
そして別の質問です。私の知る限り、すべての Class オブジェクトは fly-weight のような設計パターンに従っています。それらは同じ Class オブジェクトを同じ定義で共有しているためです。その後、固有クラスが混乱しました。固有クラスの def は実際には Class オブジェクトでメソッドを定義しているため、「def self.*」とどのように関連付けることができるでしょうか。
見た目が複雑すぎて、Ruby の設計詳細が必要なのかもしれません。
ruby - メタプログラミング:クラスメソッド内で定義されたインスタンスメソッドを呼び出すと、メソッドディスパッチはどこに表示されますか?
私はメタプログラミングRubyを読んでいて、次の言い換えられたコードについて何かを明らかにしたいと思っています。
Q1
私の最初の質問は、ファイルの最後にある2つのメソッド呼び出しに関するものです:my_class_method :foo
とmy_class_method :bar
。MyClazzオブジェクトがインスタンス化されると、両方が自動的に呼び出されると私は考えていますか?
Q2 Rubyがこれらのメソッド(def foo
およびdef bar
)を生成すると、インスタンスメソッドであっても、MyClazzの固有クラスに配置されます。つまり、これは、Rubyが必要に応じてクラスメソッドとインスタンスメソッドの両方について固有クラスを参照することを意味しますか?
本の奥深くに移動する前に、それを明確にしたいだけです。
ruby - プライベート シングルトン メソッドを見つける方法
Vehicle
私はそのようなモジュールを定義しました
Vehicle.singleton_methods
returnへの呼び出し[:build]
。
によって定義されたすべてのプライベート シングルトン メソッドを調べるにはどうすればよいVehicle
ですか?
ruby - クラスとRubyのそのクラスのシングルトンの違いは何ですか?
さて、Ruby でメタプログラミングをしようとしていますが、少し混乱しています。私が読んだいくつかの記事 (この記事など) によると、Ruby クラスにクラス メソッドを動的に追加するには、クラスのシングルトン クラスを使用する必要があります。
これはなぜですか、それはこれとどのように違うのですか?
(この質問に誤った仮定が含まれている場合は申し訳ありません。私が言ったように、私は少し混乱しています。)
ruby - クラスが固有クラスであるかどうかを知る
some_class
クラスがオブジェクトの固有クラスであるかどうかを判断する最良の方法は何ですか?
ruby-on-rails - ActiveSupport::クラスメソッドのコールバック
ActiveSupport::Callbacks
クラスメソッドで使用することは可能ですか?具体的には、以下のモジュールで、同じ状態include ActiveSupport::Callbacks
を作成define_callbacks
してrun_callbacks
共有するためにどこに配置しますか?
アップデート
可能であれば、私にはわかりませんが、それは確かActiveSupport::Callbacks
に設計されたものではありません。でステートレスインスタンスオブジェクトを作成するのが最適#handle
です。
ruby - 暗黙のコンテキストと固有クラス
私は最近、Ruby の暗黙的コンテキストに関する興味深い記事を見つけました。self
Ruby は(デフォルトのメソッド receiver ) だけでなく、現在のクラス(デフォルトの defineeまたはとも呼ばれます)への参照も保持していることを理解しました`klass'
。
記事から、定義が現在のクラスclass
の両方self
を定義されているクラスに設定すると仮定するのは正しいはずです。通常のメソッド定義 (つまり、シングルトン メソッドを定義するためにドット構文を使用しない)を考慮する限り、 を使用したメソッド定義のコンテキストでは、受信オブジェクトを参照し、現在のクラスは変更されません。def
self
定義にドット構文を考慮しないことが安全だと考える理由は、Ruby がクラスの固有クラスを開く明示的な方法も提供しているからです。私が最も興味を持っているのは、固有クラスを開くときにこれら 2 つの暗黙のコンテキストがどのように管理されるかを理解することです。 .
def
固有クラスを開くためのよく知られた構文で使用します。
foo を のシングルトン メソッド、A
つまり固有クラスのインスタンス メソッド(be it A'
) として定義します。このコードは も出力#<Class:A>
するので、<<
構文がself
と現在のクラスの両方を に設定すると言うのは正しいA'
ですか?
ruby - モジュールのシングルトンメソッドが、混合されるダウンストリームの固有クラスに表示されないのはなぜですか?
通常のメソッドルックアップパス、つまりを理解していますclass, superclass/module, all the way up to BasicObject
。シングルトンバージョンのチェーンにも当てはまると思いましたが、メタチェーンにモジュールをミックスインした場合はそうではないようです。このモジュールをVehicleの固有クラスに含めたときに、次の例でシングルトンバージョンの代わりにAutomobile
モジュールのメソッドが呼び出される理由を誰かが説明していただければ幸いです。banner
ruby - 固有クラスのクラスメソッドを呼び出す
クラスの一部のインスタンスのクラスメソッドをオーバーライドする必要があります
固有クラスを明示的に取得せずにオーバーライドされたメソッドを呼び出す方法はありますか?
ruby - Rubyで特定のシングルトン(または固有)クラスに対応するオブジェクトを取得するにはどうすればよいですか?
次のコードを想定します。
a
から得る方法はありAs
ますか?