Sha256: 3688d3a5dd097461c713259bfaad828295584d9323354a62c5dbb25738c77ee9
Contents?: true
Size: 1 KB
Versions: 1
Compression:
Stored size: 1 KB
Contents
class Value def self.new(*fields) Class.new do attr_reader *fields define_method(:initialize) do |*values| raise ArgumentError.new("wrong number of arguments, #{values.size} for #{fields.size}") if fields.size != values.size fields.zip(values) do |field, value| instance_variable_set(:"@#{field}", value) end freeze end const_set :VALUE_ATTRS, fields def self.with(hash) unexpected_keys = hash.keys - self::VALUE_ATTRS if unexpected_keys.any? raise ArgumentError.new("Unexpected hash keys: #{unexpected_keys}") end new(*hash.values_at(*self::VALUE_ATTRS)) end def ==(other) eql?(other) end def eql?(other) self.class == other.class && values == other.values end def hash values.map(&:hash).inject(0, :+) + self.class.hash end def values self.class::VALUE_ATTRS.map { |field| send(field) } end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
values-1.5.0 | lib/values.rb |