superclass=Object
type=class
library=ostruct
extended=
included=

要素を動的に追加・削除できる手軽な構造体を提供するクラスです。

OpenStruct のインスタンスに対して未定義なメソッド x= を呼ぶと、
OpenStruct クラスの [[m:Object#method_missing]] で捕捉され、そのインスタンスに
インスタンスメソッド x, x= が定義されます。
この挙動によって要素を動的に変更できる構造体として働きます。

  require 'ostruct'
  ab = OpenStruct.new
  ab.foo = 25
  p ab.foo          # => 25
  ab.bar = 2
  p ab.bar          # => 2
  p ab              # => <OpenStruct foo=25, bar=2>
  ab.delete_field("foo")
  p ab.foo          # => nil
  p ab              # => <OpenStruct bar=2>

初期化にハッシュを使用することもできます。

  son = OpenStruct.new({ :name => "Thomas", :age => 3 })
  p son.name        # => "Thomas"
  p son.age         # => 3
  son.age += 1
  p son.age         # => 4
  son.items = ["candy","toy"]
  p son.items       # => ["candy","toy"]
  p son             # => #<OpenStruct name="Thomas", age=4, items=["candy", "toy"]>

=== フリーズされている OpenStruct について

Ruby のバージョンごとに挙動が異なるので注意してください。
以下のコードを実行した場合は、表のようになります。

  require 'ostruct'
  a = OpenStruct.new
  a.x = :a
  a.freeze
  a.x = :b # この部分の挙動が異なる

  1.8.0 再代入可能
  1.8.1 TypeError
  1.8.2 再代入可能
  1.8.3 再代入可能
  1.8.4 再代入可能
  1.8.5 再代入可能
  1.8.6 再代入可能
  1.8.7 再代入可能
  1.8.8 TypeError
  1.9.1 再代入可能
  1.9.2 TypeError

同様に以下のコードを実行した場合は全てのバージョンで例外が発生します。

  require 'ostruct'
  a = OpenStruct.new
  a.x = :a
  a.freeze
  a.y = :b # TypeError
