web-dev-qa-db-ja.com

ハッシュの代わりにOpenStructを使用する必要があるのはいつですか?

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

27
mkelley33

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

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

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

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

24
Marc Baumbach

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

32
Jim Deville