問題タブ [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 - main でメソッドを定義すると、Object と main.singleton_class の両方で定義されるのはなぜですか?
定義がトップレベルで実行され、結果が驚くべきものである場合、Ruby でメソッドが定義されている場所を確認するためにチェックしていました。
foo
同時に2つのクラスで定義されているようです! 説明はありますか?
ruby - Rubyで継承はどのように機能しますか?
Dave Thomas によるRuby オブジェクト モデルの講演で、Rubyには「クラス メソッド」はありません。メソッドの受け手が「クラスオブジェクト」か「インスタンスオブジェクト」かの違いだけです。
デフォルトでは、ancestors
メソッドはメタクラスを表示しません:
ただし、実際のものは次のようになると思います。
今、継承。
以下は、 の新しい固有クラスを作成しますB
。
固有クラスも含まれている場合、 と はどのように見える
B.ancestors
でしょうか?B.metaclass.ancestors
メソッドsay_hello
は固有クラスに格納されていますが (B.class
継承元であると想定しています)、それはどこにあるのでしょうか?2 つの祖先チェーン (
B.ancestors
およびB.class.ancestors
またはB.metaclass.ancestors
) があるため、継承は実際にどのように行われるのでしょうか?
ruby - Ruby - 固有クラスのインスタンスを取得する方法はありますか?
各固有クラスにはインスタンスが 1 つしかないため、固有クラスのインスタンスを取得する方法を探しています。
ObjectSpace を調べて各固有クラスをテストすることもできますが、費用がかかると思います。
不思議なことに、一致をテストするには、各オブジェクトの固有クラスを取得する必要がありますis_a?
。
クラス (または固有クラス) のインスタンスを取得するClass#instance
orメソッドがあればいいのにと思います。Class#instances
最も直接的な方法は、固有クラスからインスタンスを抽出するinspect
ことですが、それを信頼できるかどうか疑問に思っています。
私のユースケースは、クラスメソッドのクラスを取得する必要があるということですがMethod#owner
、固有クラスが提供さMethod#receiver
れ、現在のレシーバーが提供されます。
何か案は?
ruby - Ruby 1.8 vs. 1.9: Ruby シングルトン クラスが別のクラスのサブクラスかどうかを判断する
前の質問への回答で述べたようにB < A
、クラスが別のクラスのサブクラスであるかどうかを判断する最も簡単な方法です。ただし、Ruby 1.8 (REE 1.8 も同様)B
がシングルトン クラス (つまり、eigenclass) の場合、これは失敗するようです。説明する:
ご覧のとおり、シングルトン クラス ( )A
の祖先としてリストされていますが、Ruby 1.8ではサブクラスかどうかを確認すると返されます(ただし、1.9 では正しく返されます)。チェーンをたどると、これが当てはまる理由がわかります。class << b; self; end
false
A
true
#superclass
これがたまたま 1.9 で修正された 1.8 のバグなのか、それとも 1.9 で意図的に変更された予想される動作なのか、誰にもわかりませんか? この問題に関する言及やドキュメントを他の場所で見つけようとしましたが、何も見つかりませんでした。
そして、この問題のために、シングルトン クラスがRuby 1.8のサブクラスであることを確認する最良の方法をA
誰か知っていますか? (class << b; self; end).ancestors.include?(A)
祖先のリストには含まれているモジュールも含まれているため、技術的には「正しい」わけではありませんが、回避策として行ってきました。
ruby - include によるクラス メソッドの追加
クラス メソッドとインスタンス メソッドの両方を含めたい Ruby クラスがあります。hereで説明されているパターンに従って、現在次のものを使用しています。
モジュール内のすべてのメソッドが論理的に適合するため、2 つの別個のモジュール (1 つは組み込み、もう 1 つは拡張) を作成したくありません。一方、このパターンでは、a) 追加のClassMethods
モジュールを定義する必要があり、b) すべてのモジュールに対してボイラープレートself.included
メソッドを記述する必要があります。
これを行うより良い方法はありますか?
編集 1 : 別の方法を見つけましたが、これが最初の方法よりも優れているかどうかはわかりません。
ruby - クラス、モジュール、それらの固有クラス、およびメソッドルックアップ
Module
クラスを開いて、それにメソッドを追加しましょう。
これを行うことで、このメソッドを呼び出すことができます。
Class
これは、のクラスがでありClass
、そのスーパークラスがであるため理解できModule
ます。したがって、で定義されたインスタンスメソッドを呼び出すことができますModule
。
ここで、以下のメソッドはの固有クラスbar
で定義されています。Module
でも今
また動作します。
誰かがの固有クラスのClass
メソッドにアクセスする方法を教えてModule
もらえますか?
私は今それを手に入れたと思います。メソッドルックアップは、前に説明したようには機能しません。私がそうするときClass.foo
、メソッドはClass
's eigenclassで検索され、次に'eigenclassから'seigenclassまでのスーパークラスでありModule
、BasicObject
その時点で(蛇が自分の尻尾を食べるように)自分自身をオンにしてClass
('s eigenclassのスーパークラスと同様に)、次にそのスーパークラスClass
に、メソッドが見つかります。BasicObject
Module
同様に、私が行うClass.bar
と、メソッドはClass
's eigenclassで検索され、次にModule
'seigenclassで検索されます。
私がする時
と
私が行うときの出力はwotだと思います:
これが私の現在の理解です:
ruby - Ruby クラス << クラス = Module::new
コード スニペットに次の構文がありますが、それが何をするのかわかりません。
まず、クラスまたはモジュールPushableModule
がファイル/プログラムに存在しません。次に、固有クラスを取得し、ブロックを定義する前にそれを等しく設定しているように見えますがModule::new
、これはありません理解する。誰かが私にこれを説明してもらえますか(コードスニペットが実際に何をするのか)?
ruby - ruby いつから固有クラスが誕生するのか
オブジェクトまたはクラスでシングルトン メソッドが定義される前に固有クラスが存在しますか。つまり、シングルトンメソッドまたはクラスメソッドが定義されている場合、それらは常に存在しますか、または存在しますか?
ruby - 固有クラスを列挙できますか?
呼び出しObjectSpace.each_object(Class)
ても固有クラスが返されないようです。たとえば、Ruby メタクラスを調査する場合: シングルトン メソッドを定義するときに 3 つあるのはなぜですか? ObjectSpace.count_objects[:T_CLASS]
、クラスメソッドで新しいクラスを定義する場合、whileは 3 ずつインクリメントされていましたが、 ObjectSpace.each_object(Class).count
1 だけインクリメントされていることがわかりました。
システムでアクティブな固有クラスを列挙する方法はありますか?