Class: OpenStruct (Ruby 2.3.2)
Description: Class : OpenStruct - Ruby 2.3.2

- Home
- Core 2.3.2
- Std-lib 2.3.2
- Downloads

Support for the Ruby 2.3 series has ended. See here for reference.

### Home Classes Methods

### In Files

- ostruct.rb

### Parent

Object

### Class/Module Index

Quicksearch

- OpenStruct

No matching classes.

# OpenStruct

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:¶ ↑

    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:

    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.

    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.

    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 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.