I like the "definition of arbitrary attributes" and I think the OpenStruct in ruby sometimes feels cleaner than using a hash, but I'm curious as to whether there are other specific advantages or use cases that make an OpenStruct a better choice than simply using a Hash.
An OpenStruct is a data structure, similar to a Hash , that allows the definition of arbitrary attributes with their accompanying values. This is accomplished by using Ruby's metaprogramming to define methods on the class itself.
What is a Struct in Ruby? A struct is a built-in Ruby class, it's used to create new classes which produce value objects. A value object is used to store related attributes together. Here's an example: A Point with two coordinates ( x & y ).
OpenStruct
objects are useful when you need something to fit a certain method call interface (i.e. send in a duck-typed object responding to #name
and #value
), or when you want to encapsulate the implementation details, but also want to avoid over-engineering the solution. They also make an awesome stub object, and I often use them in place of framework stubs when I don't need the overhead of a stub/mock.
I think this mostly comes down to a performance decision. From the Ruby Documentation:
An OpenStruct utilizes Ruby’s method lookup structure to and find and define the necessary methods for properties. This is accomplished through the method method_missing and define_method.
This should be a consideration if there is a concern about the performance of the objects that are created, as there is much more overhead in the setting of these properties compared to using a Hash or a Struct.
Additionally, something like a Hash
has additional functionality with all of the methods it provides (has_key?
, include?
, etc.). The OpenStruct
is a very simple object from that standpoint, but if you don't have any concerns from a performance standpoint and just want an easy object to work with, OpenStruct
is a good choice.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With