I don't have much programming experience. But, to me, Struct seems somewhat similar to Hash.
After googling, the concept of Struct is important in C, but I don't know much about C.
In Ruby, Hash is a collection of unique keys and their values. Hash is like an Array, except the indexing is done with the help of arbitrary keys of any object type. In Hash, the order of returning keys and their value by various iterators is arbitrary and will generally not be in the insertion order.
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.
The C behind the Ruby Add a hashing function on top and you've got yourself a Ruby 1.8 Hash. However, this structure also has no notion of order, which means that a separate structure has to be created if the property is needed in your application - duplicating memory, and adding overhead overall.
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.
Structs differ from using hashmaps in the following ways (in addition to how the code looks):
Struct.new(:x).new(42) == Struct.new(:x).new(42)
is false, whereas Foo = Struct.new(:x); Foo.new(42)==Foo.new(42)
is true).to_a
method for structs returns an array of values, while to_a
on a hash gets you an array of key-value-pairs (where "pair" means "two-element array")Foo = Struct.new(:x, :y, :z)
you can do Foo.new(1,2,3)
to create an instance of Foo
without having to spell out the attribute names.So to answer the question: When you want to model objects with a known set of attributes, use structs. When you want to model arbitrary use hashmaps (e.g. counting how often each word occurs in a string or mapping nicknames to full names etc. are definitely not jobs for a struct, while modeling a person with a name, an age and an address would be a perfect fit for Person = Struct.new(name, age, address)
).
As a sidenote: C structs have little to nothing to do with ruby structs, so don't let yourself get confused by that.
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