問題タブ [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 では、クラスの固有クラスを取得するのは次のようにFoo
単純です。
私は逆の操作に興味があります: 固有クラス自体から固有クラスの所有者を取得します:
固有クラスが の匿名サブクラスでClass
あるため、これが可能かどうかはわかりFoo
ません。そのため、継承階層のどこにも表示されません。固有クラスのメソッド リストを検査することも、心強いものではありません。eigenclass.name
戻りますnil
。これが可能であることを願っている唯一のこと:
明らかに、固有クラスがインスタンス化されるときにこの情報がハードコーディングされていても、固有クラスのto_s
メソッドは所有者について何らかの情報を知っています。したがって、私が知っている唯一の方法はObject.const_getting
、そのようなハックです
ruby - ruby クラスの固有クラスにインスタンスのデフォルトを設定する
これは、私がこれを達成するために管理した 1 つの方法です。
AThing のインターフェイスは、最終結果として私が望むものです。私が本当に嫌いなのは、@stuff = self.class.stuff です。
「きれいな」インターフェースを維持しながら、固有クラスを使用してそれ自体のすべてのインスタンスのデフォルトのデータセットを設定するより良い方法はありますか?
このようなコードで達成したいことは、クラス変数に格納された配列に何かを追加する add_something などのクラス メソッドを持つことです。
クラスがインスタンス化されると、その初期化メソッドでこの配列を使用して、そのインスタンスの状態を設定します。
ruby - Ruby 固有クラスの予期しない動作
まず、 「このブログ投稿からコピーした」固有クラスを取得するメソッドを追加しましょう。
次に、簡単なクラスを作成します
出力クラスへの2回目のプットを期待していました
なぜこれが起こったのか手がかりはありますか?
ruby - Rubyは、特定のクラスではなく、オブジェクト内のクラス変数を探します
この部分は機能します:
しかし、固有クラスを試してみると:
Ruby は@@var1
のObject
代わりに を検索しExample
ます。
このコードを Ruby 1.9.3 と 2.0 でテストしましたが、結果は同じでした。
なぜそれが起こるのですか?
2 つ目は、オフにできexample.get_var1
ますか (オブジェクト内のクラス変数を検索しません)。
ruby - Ruby 固有クラス (sigleton クラス) は作成されましたか? 誰のために?
Ruby のメタプログラミングで混乱しました。
したがって、チュートリアルから次のことを学びました。
したがって、これはpoopメソッドがすでに、クラスStringのcatオブジェクト用であることを意味します。有名な教科書「Ruby のプログラミング」から、cat.poopを定義することで、Ruby が匿名クラス (singleton または eigenclass とも呼ばれる) を作成し、それがcatオブジェクトのクラスになり、元のStringクラスがそのスーパークラスになります。新しく作成された固有クラス。
それからこれは私を混乱させました。次のコードを参照してください。
3 つの質問:
poopメソッドを定義するときに新しいクラスが作成されたようには見えません。それとも、作成されたものの、「#class」メソッドが呼び出しをスーパークラスの #class に自動的にリダイレクトしたのでしょうか? どちらが正しい?どうやってチェックするの?
別のメソッド、たとえばcat.runを定義すると、別の固有クラスが作成されるかどうか? その場合、クラス階層はどうなりますか?
catが「kate」に再定義された場合、うんちは見つかりません。なんで?うんちは猫が利用できるべきではありませんか?
ありがとう!
ruby - クラス オブジェクトの固有クラスを開くために、なぜ「class << self」が「class << Foo」よりも一般的ですか?
Ruby プログラマーは通常、次のようclass << self
にクラス本体内で使用して、クラス オブジェクトの固有クラスを開きます。
Foo
ただし、この同等の形式はめったに見ません (クラスとして既に定義されていると仮定します)。
2 番目のスタイルよりも 1 番目のスタイルを好む理由はありますか?
ruby - クラスを拡張するモジュールシングルトンを持つ
私のアプリケーションには、アプリケーション間で再利用されるシングルトンがあります。そのシングルトンがクラスからいくつかのデフォルト メソッドを取得するだけでなく、モジュール/固有クラスをカスタマイズできるようにしたいです。instance
何よりも、すべての呼び出しでユーティリティ シングルトンを呼び出したくありません。
これが例です。私のデフォルトのクラスがUniverse::Earth
. 次に、Earth
そのクラスを「拡張」するモジュールがアプリケーションに必要です。
それが実行さgrow!
れると、NoMethodError
.
これらのアプローチを試しました:
どうすれば機能しますか?
ruby - スーパークラスからのサブクラスのクラス インスタンス変数の初期化
以下のコードのスーパークラスを考えると、すべてのサブクラスにいくつかのインスタンス変数が必要です。
以下のコードはそれを行いますが、考えられるすべてのサブクラスに対してその変数を適切に初期化できません。
スーパークラスの固有クラスを開きました。これがコードです(これもrubyfiddleにあります):
可能なすべてのサブクラスを初期化したいと思います。最初の 2 つのプットでは、のみSomeSuperClass.variable
が初期化されます。考えられるすべてのサブクラスに対してこの変数を初期化する方法がわかりません。何か案は?
私が見つけた最善の解決策は、次のように、アクセサーをオーバーライドして変数を遅延初期化することです。
動機:
特定のクラスのすべてのサブクラスが必要です。それを警戒と呼びましょう。直接のサブクラスで起こっていることを監視できます。この情報はクラスに保存されるため、それぞれの状態が異なります。
2 つのクラス A < B が同じ変数を変更するため、クラス変数は使用できません。サブクラスにも直接アクセスできないため、Vigilant のすべてのサブクラスに、サブクラスに関する情報を保存および取得するための容量を与える方法が必要でした。
固有クラスを開くアクセサーを定義することにより、次のように言えます。
メソッド (アクセサ) がそのスーパークラスの固有クラスに追加されたため、すべてのサブクラス Bclass B < A; end
が実行できるようになり、ルックアップで見つけることができます。B.x
最初の例は、Bx が Ax と異なることを示しています。
さて、私が本当に理解していないのは、x がどこにあるかです。アクセサーではなく、変数。私がそれを行うB.instance_variables
と[]
、 B.singleton_class.instance_variables と同じように表示されます
ruby - Ruby - ローカル変数を obj の固有クラスと共有する
メソッドに渡すMyObject
ハッシュに基づいて、初期化された Ruby オブジェクトのメソッドを動的に定義しようとしています。メソッドの本体には、次のものがあります。my_hash
initialize
initialize
これは で失敗しますundefined local variable or method 'key' for #<Class:#<MyObject:0x007fc7abw0cra0>>
。理由はありますか?
はmy_hash
、多数のラクダ化されたキーを含む json 応答から作成されるため、必要な値を取得するための単純な Ruby メソッドを使用する方が便利です。