From: "Mauricio Fernández" Date: 2005-09-15T00:38:00+09:00 Subject: Re: Sets, uniqueness not unique. On Wed, Sep 14, 2005 at 11:12:16PM +0900, Hugh Sasse wrote: > + def eql?(other) > + (self.class)::FIELDS.inject(true) do |b,v| > + begin > + b && (self.send(v) == other.send(v)) > + rescue > + b = false > + end > + end > + end Just one minor comment: batsman@tux-chan:~$ cat /tmp/fdsfdsdsd.rb class Foo FIELDS = %w[name stuff foo bar] attr_reader(*FIELDS) def initialize(name, stuff, foo, bar) @name, @stuff, @foo, @bar = name, stuff, foo, bar end def eql1?(other) (self.class)::FIELDS.inject(true) do |b,v| begin b && (self.send(v) == other.send(v)) rescue b = false end end end def eql2?(other) # maybe add self.class::FIELDS == other.class::FIELDS test plus rescue NameError ? self.class::FIELDS.each{|m| break false if self.send(m) != other.send(m) } && true rescue NoMethodError false end end require 'benchmark' a = Foo.new("a", "b", "c", "d") b = Foo.new("e", "b", "c", "d") c = Foo.new("a", "b", "c", "e") TIMES = 100000 %w[a b c].each{|x| puts "#{x} = #{eval(x).inspect}"} Benchmark.bmbm do |x| %w[a b c].each do |o| %w[eql1? eql2?].each do |m| s = "a.#{m}(#{o})" x.report("#{s}: #{eval(s)}") { eval("TIMES.times{#{s}}") } end end end batsman@tux-chan:~$ ruby -v /tmp/fdsfdsdsd.rb ruby 1.8.3 (2005-05-22) [i686-linux] a = # b = # c = # Rehearsal ----------------------------------------------------- a.eql1?(a): true 1.520000 0.000000 1.520000 ( 1.658224) a.eql2?(a): true 0.880000 0.000000 0.880000 ( 0.970675) a.eql1?(b): false 1.070000 0.000000 1.070000 ( 1.156081) a.eql2?(b): false 0.360000 0.010000 0.370000 ( 0.410011) a.eql1?(c): false 1.570000 0.000000 1.570000 ( 1.734145) a.eql2?(c): false 0.910000 0.000000 0.910000 ( 1.003833) -------------------------------------------- total: 6.320000sec user system total real a.eql1?(a): true 1.510000 0.010000 1.520000 ( 1.679369) a.eql2?(a): true 0.890000 0.000000 0.890000 ( 0.950153) a.eql1?(b): false 1.100000 0.010000 1.110000 ( 1.200057) a.eql2?(b): false 0.360000 0.000000 0.360000 ( 0.383755) a.eql1?(c): false 1.560000 0.010000 1.570000 ( 1.739114) a.eql2?(c): false 0.920000 0.000000 0.920000 ( 0.978109) -- Mauricio Fernandez