問題タブ [metaprogramming]
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.
reflection - リフレクション: フレームワークのみ?
私が一緒に働いていて尊敬している誰かが、アプリケーションコードでリフレクションを使用する必要はなく、フレームワークでのみ使用する必要があると私に言ったことがあります。彼は J2EE のバックグラウンドから話していましたが、そのプラットフォームに関する私の専門的な経験は、一般的にそれを裏付けています。ただし、Java を使用してリフレクション アプリケーション コードを 1 回か 2 回作成したことがあります。
私の Ruby on Rails の経験は根本的に異なります。なぜなら、Ruby は動的コードを書くことをかなり奨励するからです。Rails が提供する機能の多くは、リフレクションとメタプログラミングなしでは不可能であり、同じ手法の多くは、アプリケーション コードに同様に適用可能であり、有用です。
- リフレクションはフレームワーク専用であるという見方に同意しますか? ご意見や経験談をお聞かせいただければ幸いです。
ruby-on-rails - Railsでattr_accessibleを動的に呼び出すにはどうすればよいですか?
子クラスが仮想フィールドを宣言できるようにする、かなりユニークなクラスがあります。子は、次のように親クラスのメソッドを呼び出すことにより、XMLとして格納された仮想フィールドを宣言できます。
私は厄介な回避策を介してそれを機能させることができました。create_xml_fieldメソッドは、フィールド名をクラス変数に格納します(以下を参照)。init_xml_fieldsメソッドは、after_initializeメソッド内から呼び出されます。
やっかいなえ?私は誇りに思っていませんが、それを機能させるのに苦労しています。また、回避策は、フォームパラメータの一括割り当てでは機能しません。
子クラスでの一括割り当てを許可するためにattr_acessibleを動的に呼び出した経験はありますか?前もって感謝します!
この投稿はわかりやすくするために編集されました。
ruby - モジュールで利用可能なクラスを見つける
モジュールがありますMyModule
。クラスを動的にロードします。名前空間内で定義されているクラスのリストを取得するにはどうすればよいですか?
例:
f
それぞれに「class Foo; end」のようなものが含まれていると言わざるを得ません。
次のように考えることもできます。Rails では、ActiveRecord モジュール内で定義されているすべてのクラスをプログラムで見つけるにはどうすればよいでしょうか?
reflection - リフレクションとは正確には何ですか?
リフレクションとは正確には何ですか?このテーマに関するウィキペディアの記事を読み、プログラムが実行時に自分自身を変更できる一種のメタプログラミングであることを理解しましたが、これはどういう意味ですか? これはどのような状況で良いアプローチで、いつ使用するのが最適ですか?
hash - Dでユーザー定義型を一意に識別する方法は?
D プログラミング言語でユーザー定義型 (構造体またはクラス) の一意のハンドルとして使用できるものを生成する必要があります。これは、コンパイル時に計算可能な値であることが望ましいです。ハンドルを型の名前に関連付け、型の内部構造 (データ レイアウト) が変更された場合に変更する必要がありますが、他のほとんどの編集では同じままです (同じ型を別のアプリにコンパイルすることを含む)。
これはセキュリティの問題ではないため、バイパスするのが難しい必要はありません。
私の現在の考えは、型名とメンバーの型と名前の MD5 ハッシュのような文字列を使用することです。
何かご意見は
c++ - 実行時にテンプレート メタプログラミングのコンパイル時定数を取得する
バックグラウンド
次の点を考慮してください。
これは一般的な例で、フィボナッチ数の値をコンパイル時の定数として取得できます。
しかし、明らかに実行時に値を取得することはできません:
fibbはコンパイル時の定数ではないためです。
質問
だから私の質問は:
実行時にこのテーブルを覗く最良の方法は何ですか? 最も明白な解決策 (「解決策」は軽視する必要があります) は、大きな switch ステートメントを使用することです。
しかし、現在、テーブルのサイズは非常にハードコードされており、40 まで拡張するのは容易ではありません。
私が思いついたのは、同様のクエリ方法を持つ唯一のものです。
これはうまくいくようです。私が見る唯一の問題は次の2つです。
Fibonacci<2> を計算するには、TableMax を 2 まで通過する必要があるため、コール スタックが大きくなる可能性があります。
値がテーブルの外にある場合は、計算ではなくゼロを返します。
それで、私が見逃しているものはありますか?実行時にこれらの値を選択するより良い方法があるはずです。
おそらく、switch ステートメントのテンプレート メタプログラミング バージョンで、switch ステートメントを特定の数まで生成しますか?
前もって感謝します。
c++ - C++ テンプレートの特殊化の問題
タイプとそのタイプのオブジェクトを指定すると、実際のオブジェクトにアクセスしながら、タイプが整数かどうかに基づいて決定できる C++ テンプレートが必要です。私はこれを試しました
しかし、うまくいきません。同様のことを達成する方法はありますか?
編集
私が達成しようとしていたのは、コンパイル時に発生する次のようなものでした。
次のように、テンプレートのインスタンス化でオブジェクトへのポインターまたは参照を実際に渡すことができます。
しかし、どうやらこれで達成できるのは、x
の型を推測してテンプレートを初期化することだけであり、x
グローバルに宣言する必要もあります。私がやろうとしていることは何の役にも立ちませんが、コンパイル時には結局不可能だと思います。
groovy - メタクラスでそのメソッドを使用して、groovy でメソッドの動作を変更する方法
次の方法で、Groovy の plus メソッドを「台無し」にしたいと思います。
私は StackOverflowException を取得しています (これは驚くべきことではありません)。
メタクラスのクロージャ内で「オリジナル」とメソッドを使用する方法はありますか?
objective-c - クラスを参照せずにObjective Cで+classメソッドを呼び出すにはどうすればよいですか?
ポリシー クラスのセットでクラス メソッドとして実装すると便利だと思われる一連の「ポリシー」オブジェクトがあります。このためのプロトコルを指定し、準拠するクラスを作成しました (以下に示すのは 1 つだけです)。
次に、このプロトコルに準拠するクラスの配列があります (CurrentListCounter のように)
オブジェクトのようなクラスをどのように使用しているかに注意してください (これは私の問題かもしれません。Smalltalk では、クラスは他のすべてのオブジェクトと同じようにオブジェクトです。Objective-C にあるかどうかはわかりません)。
私の正確な問題は、配列からポリシー オブジェクトの 1 つを取得するときにメソッドを呼び出したい場合です。
return ステートメントで警告が表示されます - -countFor: not found in protocol と表示されます (そのため、クラス メソッドを呼び出したいインスタンス メソッドを想定しています)。ただし、配列内のオブジェクトはクラスのインスタンスであるため、インスタンス メソッドのようになりました (概念的にはそうあるべきです)。
クラスメソッドを呼び出す魔法の方法はありますか? それとも、これは単に悪い考えであり、ポリシー オブジェクトのインスタンスを作成するだけでよいのでしょうか (クラス メソッドは使用しないでください)。
powershell - PowerShell メタプログラミング - 高度な関数の生成
一連の高度な機能を動的に構築することを検討しています。これにはNew-PSScriptを使用していますが、私が求めているすべての柔軟性が得られるわけではありません。
関数の高度なパラメーターについてのマニュアル ページを読んでいたところ、ヘルプ記事の最後に動的パラメーターに関する記述があり、次のサンプル コードが表示されていました。
RuntimeDefinedParameter と属性のコレクションを使用して新しい関数を生成できるかどうか疑問に思っています。
一部の準疑似コードは次のようになります。私が構築しようとしている (と思う) 2 つの重要な関数は、New-Parameter と Add-Parameter です。
私は完全に間違った木を吠えていますか? これを行う他の方法がいくつかある場合、私は可能性を広く開いています。