2006/5/5, Mark Volkmann <r.mark.volkmann / gmail.com>: > Comparing objects in Ruby can be a little confusing. Let me know if > I've got this straight. > > eql? > - determines whether two object references refer to objects that > have the same "value" > - for example, my_car.eql?(your_car) > could test whether my car and your car have the same make, model and year > - need to override this method in the Car class to be meaningful, > otherwise it's the same as == This is called "equivalence". > equal? > - determines whether two object references refer to the same object in memory > (have the same object id) > - for example, my_car.equal?(your_car) > tests whether we share the same car This is called "identity". > == > - sometimes same as equal?, but sometimes different > - for example, mixing in the Comparable module changes it to be based on > <=> which would be overridden This again is "equivalence". > I kind of wish that "eql?" was named "same_value" and "equal?" was > named "same_object?" so it would be easier to remember. Using "==" > seems somewhat dangerous unless you're working with built-in types or > types that you know mixin Comparable. Otherwise there is some > uncertainty about what it does without looking at the code of the > classes being compared. The most notable exception I am aware of is this: irb(main):060:0> 2.eql? 2.0 => false irb(main):061:0> 2 == 2.0 => true A Hash uses eql? HTH robert -- Have a look: http://www.flickr.com/photos/fussel-foto/