|Number of watchers on Github||102|
|Number of open issues||3|
|Average time to close an issue||3 months|
|Average time to merge a PR||3 days|
|Open pull requests||11+|
|Closed pull requests||3+|
|Last commit||over 2 years ago|
|Repo Created||almost 6 years ago|
|Repo Last Updated||over 2 years ago|
|Organization / Author||stitchfix|
|Do you use immutable-struct? Leave a review!|
|View open issues (3)|
|View immutable-struct activity|
|View on github|
|Fresh, new opensource launches 🚀🚀🚀|
Software engineers: It's time to get promoted. Starting NOW! Subscribe to my mailing list and I will equip you with tools, tips and actionable advice to grow in your career.
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.
Add to your +Gemfile+:
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 new_person = p.merge(name: "Other Dave", age: 41) # returns a new object with merged attributes new_person.name # => "Other Dave" new_person.age # => 41 new_person.active? # => true
You can treat the interior of the block as a normal class definition with the exception of setting constants. Use +const_set+ to scope constants as-expected.
Point = ImmutableStruct.new(:x, :y) do const_set(:ZERO, 0) ONE_HUNDRED = 100 end Point::ZERO # => 0 ::ONE_HUNDRED # => 100 ::ZERO # => NameError: uninitialized constant ZERO
RC release to incorporate #33, which allows
.to_json calls on
ImmutableStruct objects to be made recursively and include all Zero-argument methods as well.
hashmethod to enable immutable-struct instances to be Set-friendly. Hash code values are constructed from the state (all attribute values) and the class
#to_h serializes all instance methodsfrom @nandosola's PR. Thank you, @nandosola!