An immutable implementation of Ruby's Struct
class. It works just as Struct, but there are no setters, and you can't use []=
.
class Spaceship < ImmutableStruct.new(:name, :max_speed)
end
ship = Spaceship.new('Enterprise', 'Warp 9')
puts ship.max_speed # => Warp 9
ship.max_speed = '299792458 m/s' # raises NoMethodError
In addition to the above, ImmutableStruct
enhances the constructor to accept a hash (but as you can see above the Struct
behaviour works too):
ship = Spaceship.new(:max_speed => '∞', :name => 'The TARDIS')
puts ship.max_speed # => ∞
You can create a strict version of the struct, which will raise an error if you initialize it with a Hash that does not contain all the fields of the struct
StrictSpaceship = Spaceship.strict
strict_ship = StrictSpaceship.new(:name => 'Enterprise') # raises ArgumentError
I'm surprised every time I look at the RDoc for Struct
that it doesn't do this.