From: "Marcel Molina Jr." Date: 2005-03-08T05:16:17+09:00 Subject: Customizing Array#uniq by defining eql? PickAxe II's documentation for Array#uniq says, Returns a new array by removing duplicate values in _arr_, where duplicates are detected by comparing using +eql?+. Given that say I have a simple class: class PossibleTime attr_reader :day, :start_time, :end_time def initialize(day, start_time, end_time) @day, @start_time, @end_time = day, start_time, end_time end def hash "#@day #@start_time #@end_time" end def ==(other_pt) self.hash == other_pt.hash end def eql?(other_pt) self == other_pt end end Here +eql?+ is defined in terms of +==+. Creating two example instances shows these methods working: > a = PossibleTime.new('M', '9:30', '10:30') > b = PossibleTime.new('M', '9:30', '10:30') > c = PossibleTime.new('T', '9:30', '12:00') > a == b => true > a.eql? b => true > a == c => false > [a,b].uniq.size => 2 > # I was expecting 1, not 2 I'll add debugging to see if +eql?+ was even called: class PossibleTime def eql?(other_pt) puts 'eql? called' self == other_pt end end > a.eql? b eql? called => true > a.eql? c eql? called => false > [a,b].uniq.size => 2 So eql? isn't even being called. Am I overlooking something? Specifying something incorrectly? Not understanding the fundamental interaction between eql? and uniq? Thanks for your time, marcel -- Marcel Molina Jr.