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/