Type:
Class
Constants:
InspectKey : :__inspect_key__

OpenStruct serialization/deserialization

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.

Examples:

1
2
3
4
5
6
7
8
9
10
require 'ostruct'
 
person = OpenStruct.new
person.name    = "John Smith"
person.age     = 70
person.pension = 300
 
puts person.name     # -> "John Smith"
puts person.age      # -> 70
puts person.address  # -> nil

An OpenStruct employs a Hash internally to store the methods and values and can even be initialized with one:

1
2
australia = OpenStruct.new(:country => "Australia", :population => 20_000_000)
p australia   # -> <OpenStruct country="Australia" population=20000000>

Hash keys with spaces or characters that would normally not be able to use for method calls (e.g. ()[]*) will not be immediately available on the OpenStruct object as a method for retrieval or assignment, but can be still be reached through the Object#send method.

1
2
3
4
5
6
7
measurements = OpenStruct.new("length (in inches)" => 24)
measurements.send("length (in inches)"# -> 24
 
data_point = OpenStruct.new(:queued? => true)
data_point.queued?                       # -> true
data_point.send("queued?=",false)
data_point.queued?                       # -> false

Removing the presence of a method requires the execution the #delete_field method as setting the property value to nil will not remove the method.

1
2
3
4
5
6
7
8
first_pet = OpenStruct.new(:name => 'Rowdy', :owner => 'John Smith')
first_pet.owner = nil
second_pet = OpenStruct.new(:name => 'Rowdy')
 
first_pet == second_pet   # -> false
 
first_pet.delete_field(:owner)
first_pet == second_pet   # -> true

Implementation:

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.

[]=
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

[]=(name, value) Instance Public methods Sets the value of a member.

2025-01-10 15:47:30
eql?
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

eql?(other) Instance Public methods Compares this object and other

2025-01-10 15:47:30
to_json
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

to_json(*args) Instance Public methods Stores class name (OpenStruct) with this

2025-01-10 15:47:30
marshal_dump
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

marshal_dump() Instance Public methods Provides marshalling support for use

2025-01-10 15:47:30
json_create
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

json_create(object) Class Public methods Deserializes

2025-01-10 15:47:30
each_pair
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

each_pair() Instance Public methods Yields all attributes (as a symbol) along

2025-01-10 15:47:30
delete_field
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

delete_field(name) Instance Public methods Remove the named field from the object

2025-01-10 15:47:30
to_s
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

to_s() Instance Public methods Alias for:

2025-01-10 15:47:30
modifiable
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

modifiable() Instance Protected methods Used internally to check if the

2025-01-10 15:47:30
hash
  • References/Ruby on Rails/Ruby/Classes/OpenStruct

hash() Instance Public methods Compute a hash-code for this

2025-01-10 15:47:30