Sha256: ee9e88ce927ac4761afa698ca4a704d08a8cd14e99f37366a163372307c0fade
Contents?: true
Size: 1.2 KB
Versions: 1
Compression:
Stored size: 1.2 KB
Contents
class Value def self.new(*fields, &block) Class.new do attr_reader(:hash, *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 @hash = self.class.hash ^ values.hash 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 missing_keys = self::VALUE_ATTRS - hash.keys if missing_keys.any? raise ArgumentError.new("Missing hash keys: #{missing_keys} (got keys #{hash.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 values self.class::VALUE_ATTRS.map { |field| send(field) } end class_eval &block if block end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
values-1.6.0 | lib/values.rb |