class Dry::Equalizer
Define equality, equivalence and inspection methods
Constants
- VERSION
Gem version
Public Class Methods
Initialize an Equalizer
with the given keys
Will use the keys with which it is initialized to define cmp?, hash, and inspect
@param [Array<Symbol>] keys @param [Hash] options @option options [Boolean] :inspect whether to define inspect method @option options [Boolean] :immutable whether to memoize hash method
@return [undefined]
@api private
# File lib/dry/equalizer.rb, line 24 def initialize(*keys, **options) @keys = keys.uniq define_methods(**options) freeze end
Private Instance Methods
Define an cmp? method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/dry/equalizer.rb, line 64 def define_cmp_method keys = @keys define_method(:cmp?) do |comparator, other| keys.all? do |key| __send__(key).public_send(comparator, other.__send__(key)) end end private :cmp? end
Define a hash method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/dry/equalizer.rb, line 79 def define_hash_method(immutable:) calculate_hash = ->(obj) { @keys.map { |key| obj.__send__(key) }.push(obj.class).hash } if immutable define_method(:hash) do @__hash__ ||= calculate_hash.call(self) end define_method(:freeze) do hash super() end else define_method(:hash) do calculate_hash.call(self) end end end
Define an inspect method that reports the values of the instance's keys
@return [undefined]
@api private
# File lib/dry/equalizer.rb, line 101 def define_inspect_method keys = @keys define_method(:inspect) do klass = self.class name = klass.name || klass.inspect "#<#{name}#{keys.map { |key| " #{key}=#{__send__(key).inspect}" }.join}>" end end
Define the equalizer methods based on keys
@param [Boolean] inspect whether to define inspect method @param [Boolean] immutable whether to memoize hash method
@return [undefined]
@api private
# File lib/dry/equalizer.rb, line 53 def define_methods(inspect: true, immutable: false) define_cmp_method define_hash_method(immutable: immutable) define_inspect_method if inspect end
Hook called when module is included
@param [Module] descendant
the module or class including Equalizer
@return [self]
@api private
# File lib/dry/equalizer.rb, line 40 def included(descendant) super descendant.include Methods end