29

私は「任意の属性の定義」が好きで、ルビーのOpenStructはハッシュを使用するよりもクリーンに感じることがあると思いますが、OpenStructを単に使用するよりも良い選択にする他の特定の利点やユースケースがあるかどうかについて興味がありますハッシュ。

4

2 に答える 2

38

OpenStructオブジェクトは、特定のメソッド呼び出しインターフェイスに適合するものが必要な場合(つまり、#nameとに応答するダックタイプのオブジェクトを送信する#value場合)、または実装の詳細をカプセル化したいが、ソリューションの過剰なエンジニアリングを避けたい場合に役立ちます。それらは素晴らしいスタブオブジェクトも作成し、スタブ/モックのオーバーヘッドが必要ない場合は、フレームワークスタブの代わりにそれらを使用することがよくあります。

于 2013-01-20T02:50:38.093 に答える
26

これは主にパフォーマンスの決定に帰着すると思います。Rubyドキュメントから:

OpenStructは、Rubyのメソッドルックアップ構造を利用して、プロパティに必要なメソッドを検索および定義します。これは、メソッドmethod_missingおよびdefine_methodによって実現されます。

ハッシュまたは構造体を使用する場合と比較して、これらのプロパティの設定にははるかに多くのオーバーヘッドがあるため、作成されるオブジェクトのパフォーマンスに懸念がある場合は、これを考慮する必要があります。

さらに、のようなものにHashは、それが提供するすべてのメソッド(、、など)を備えた追加機能がありhas_key?ますinclude?。これOpenStructは、その観点からは非常に単純なオブジェクトですが、パフォーマンスの観点からは何の懸念もなく、簡単なオブジェクトで作業したい場合OpenStructは、良い選択です。

于 2013-01-20T02:48:32.937 に答える