ImmutableStruct¶ ↑
Creates struct-like classes (that can build value objects) that do not have
setters and also have better constructors than Ruby's built-in
Struct
.
This is highly useful for creating presenters, non-database-related models,
or other quick and dirty classes in your application. Instead of using a
Hash
or OpenStruct
, you can create a bit more
clarity around your types by using ImmutableStruct
, which is
almost as convienient.
Install¶ ↑
Add to your Gemfile
:
gem 'immutable-struct'
Then install:
bundle install
If not using bundler, just use RubyGems:
gem install immutable-struct
To use¶ ↑
Person = ImmutableStruct.new(:name, :age, :job, :active?, [:addresses]) do def minor? age < 18 end end p = Person.new(name: "Dave", # name will be 'Dave' age: 40, # age will be 40 # job is omitted, so will be nil active: true) # active and active? will be true # addresses is omitted, but since we've selected # Array coercion, it'll be [] p.name # => "Dave" p.age # => 40 p.active? # => true p.minor? # => false p.addresses # => [] p2 = Person.new(name: "Dave", age: 40, active: true) p == p2 # => true p.eql?(p2) # => true SimilarPerson = ImmutableStruct.new(:name, :age, :job, :active?, [:addresses]) sp = SimilarPerson.new(name: "Dave", age: 40, active: true) p == sp # => false # Different class leads to inequality
You can also treat the interior as a normal class definition.