問題タブ [moose]
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.
perl - メタプログラミングを使用して Perl で SOAP クライアントを実装することは賢明ですか?
私は現在、SOAP::WSDL で生成された数十のクラスを含むコード ベースを扱っています。しかし、Moose と一緒に仕事をしてきた私は、これらのクラスを実行時にメタ レベルで生成する (つまり、ディスク上のファイルではなく、オブジェクトに直接生成する) 方が良いと考えています (この時点ではパフォーマンス上の理由を完全に除外しています)。
このアプローチは賢明ですか?アイデアは、生成されたコードの変更を回避し、たまに再生成することを回避することです。
もしそうなら、WSDL からクラスを作成するすぐに使える Perl モジュールはありますか?
perl - Moose:エクスポーターを拡張するとコンストラクターが消えますか?
ここに私が理解できない奇妙なことがあります。古い標準の Exporter モジュールを使用して、いくつかの定数もエクスポートしたい Moose クラスがあります。ただし、クラスに追加extends Exporter
するとすぐに、何らかの理由で、デフォルトの Moose コンストラクターが継承されなくなり、致命的なエラーが発生します。
これは、問題を示す簡単なテストです。
行を削除extends
すると、問題がなくなります。
これは Moose 0.93 を使用しています。
perl - 同じ必須属性が提供されている場合、新しいオブジェクトを作成するのではなく、既存のムースオブジェクトを取得することは可能ですか?
次のMooseパッケージがあるとします。
次に、2つのオブジェクトを作成し、一方をもう一方の「NEIGHBOUR」属性として追加します。
別の場所、たとえば別の手順で、$bのBCCH属性を別の値に更新できます。
さて、私が言及すると
その後、更新された値ではなく、BCCH属性の初期値が返されます。
賢明なことは、問題を解決する$b自体ではなく$bへの参照を追加することだと思います。
ただし、$ b(同じID)に相当するオブジェクトが多数のメソッドでインスタンス化され、いずれか1つで変更を行うことができるため、作成したすべてのオブジェクトの参照を渡すことが困難なWebアプリケーションのシナリオがあります。
理想的には、
が作成された場合、同じIDを持つオブジェクトがまだ存在しない場合にのみオブジェクトを作成する必要があります。
辞書は次のようなものです。
またはより良い解決策はありますか?
perl - new の呼び出し時に Perl Moose 読み取り専用属性が設定されないようにするにはどうすればよいですか?
new の呼び出しで初期化できない Moose の読み取り専用属性を単純に宣言したいと思います。したがって、次のように宣言した後:
私は次のことをしたくありません:
perl - Mooseオブジェクト内からMoose::Exporterを使用する方法はありますか?
スタンドアロンのユーティリティクラスではなく、親のMooseクラス内からいくつかのヘルパーメソッドを設定する方法を探しています。可能であれば、ヘルパーモジュールを明示的に要求する必要がないため(すべてがextends
宣言を介して行われるため)、モジュールにムースシュガーを追加するより透過的な方法になります。
ドキュメントで提供されている例に基づいて、これは大まかに私が目指していることです:
ただし、これは機能しません。
PS。with Role;
また、エクスポートマジックを(ではなく)ロールに移動しようとしましたextends Parent;
が、同じエラーが発生します。
perl - Perlのハッシュに格納されている関数名を呼び出すにはどうすればよいですか?
これはどこかのドキュメントでカバーされていると確信していますが、見つけることができませんでした...名前がハッシュに格納されているクラスのメソッドを呼び出すことができる構文糖衣を探しています(単純なスカラーとは対照的に):
$hash{func}
最初にスカラー変数にコピーすると、問題なく呼び出すことができますFoo->$func
...しかし、機能させるために何が欠けていFoo->$hash{func}
ますか?
(編集:クラスでメソッドを呼び出すことによって特別なことをするつもりはありませんFoo
-これは同じように簡単に祝福されたオブジェクトになる可能性があります(そして私の実際のコードではそうです);自己完結型を書くのは簡単でしたクラスメソッドを使用した例。)
編集2:完全を期すために、以下のコメントを参照してください。これは私が実際に行っていることです(これは、Moose :: Exporterで作成されたMoose属性sugarのライブラリにあります):
上記のマークされた行を次のように置き換えました。
PS。Class :: MOP :: Attributeには同様のアクセサーがないため、この同じ手法(Mooseメタクラスを使用して命名規則を想定するのではなくcoderefを検索する)を述語にも使用できないことに気づきました。:(get_predicate_method_ref
perl - 配列として返される Moose ArrayRef 属性
ArrayRef (読み取り専用) であり、オブジェクトによって内部的に操作される属性を持つ Moose クラスがあります。しかし、誰かがアクセサー メソッドを呼び出すと、参照ではなく配列 (またはリスト) を返すようにします。これにより、クラスのユーザーが行う逆参照の量が削減されるだけでなく、オブジェクトが使用している同じ参照を誤って改ざんすることができなくなります。
では、これを行う最善の方法は何ですか? なんらかの強制?
perl - Mooseを使用して属性のメタオブジェクトから値のインスタンスを作成するにはどうすればよいですか?
私は、Mooseを使用して、非標準形式に準拠するファイルの読み取りと書き込みを行うシリアル化ツールに取り組んでいます。今のところ、クラス内のオブジェクトのデフォルト値に基づいて次のアイテムをロードする方法を決定しますが、それには独自の欠点があります。代わりに、属性メタクラスの情報を使用して、適切なタイプの新しい値を生成できるようにしたいと思います。'isa'制限が何であるかを判断し、そこからジェネレーターを導出する方法があると思いますが、Moose :: Meta::AttributeまたはClass::MOP::Attributeに役立つ特定のメソッドはありませんでした。
ここにもう少し例があります。次のクラスがあるとしましょう。
(詳細な説明:このファイルタイプのシリアル化の役割My::Role::Load
をMy::Role::Save
実装します。それらは、接続されているクラスの属性を反復処理し、シリアル化する順序について属性クラスを調べます。)
このMy::Role::Load
ロールでは、クラスのメタオブジェクトを反復処理して、使用可能なすべての属性を確認し、Order特性を持つ属性のみを選択できます。
isa
ここで、メタ属性が表す属性について知る必要があります。今、私はそれのインスタンスを取得し、次のようなものでテストすることによってそれをテストします:
ただし、でわかるように# <-- ERROR PRONE PROBLEM HERE!
、このプロセス全体は、最初に属性に値があることに依存しています。値がundefの場合、何をロードするかはわかりません。$attribute->get_value($self)
代わりに、ロードする必要のある値のタイプに関する情報を取得する方法に置き換えたいと思います。私の問題は、上記でリンクしたドキュメントClass::MOP::Attribute
がMoose::Meta::Attribute
、属性が取得するはずのオブジェクトのタイプを取得する方法がないように見えることです。
属性のタイプ情報は、基本的に私が取得しようとしているものです。
Moose::Meta::TypeConstraint
(将来の読者への注意:ここでの答えは私を始めましたが、それ自体が最終的な解決策ではありません。私がここで探していることを実際に行うには、クラスを掘り下げる必要があります。)
perl - Perl のパッケージから継承するすべてのパッケージを見つけるにはどうすればよいですか?
仕事で使用するために、データをダウンロードして (Perl を使用して) 他の形式に変換するさまざまなサイトがいくつかあります。これらはすべて、次のような 1 つの Perl スクリプトから実行されます。
などなど。現時点では、それぞれMy::Package
が独自のパッケージです。基本パッケージなどから継承しません。を使用してそれらを書き直すことを計画してMoose
おり、新しいパッケージが追加されるたびにダウンロードを実行する Perl スクリプトを編集する必要がなく、基本パッケージから継承するパッケージを見つける方法があるかもしれないことを望んでいました。次に、ループでそれぞれをインスタンス化し、ダウンロードを行います。
それは可能ですか?
ティア
perl - 同時に多くの Moose 属性を割り当てるにはどうすればよいですか?
私は、パイプ区切りから行を読み取り、それぞれを分割し、ハッシュスライスを使用してそれらをハッシュに追加するコードを徐々に Moose 化しています。
ハッシュをMooseクラスに変換しましたが、ファイルのフィールドをクラスの属性にすばやく割り当てる方法がわかりません(仮にあったとしても)。
私は非常に簡単にできることを知っています:
しかし、私は、次のように、すべての属性を一度に割り当てるための簡単なワンライナーを望んでいました。
私は強制について読んだことがありますが、私が言えることから、それは私が求めているものではありません.
出来ますか?
ありがとう