I'll give you an actual use-case from my current work in natural language processing. I have Word objects which have various properties, not all of which are important to 'equality' for Words (and which may vary for two equal words). As an example, a verb might have two different subjects in two different contexts - from a Word-oriented perspective, they're identical, from other perspectives they may not be.
I define '==' to reflect what equality should be for words, something like this:
class Word
attr :stem, :text, :category, :pos, :etc
def ==(word)
# a 'stem' is the root form of a word,
# e.g., 'looking'.stem => 'look'
self.stem == word.stem
end
end
On the other hand, when I'm comparing words, I want to make sure I'm not generating spurious matches by comparing a particular Word to itself, so I check for that with the default implementation of eql? The only way to avoid using eql? would be to invent something functionally equivalent - maybe a variable to hold the precise position of the word in the text, and then a predicate method to compare positions. But eql? is there, so that's what I use.
Coming from C, I tend to think of Ruby variables as pointers to values, so I tend to think of the difference between eql? and == as akin to the following:
Ruby eql? - i.e., are they at the same spot in memory?
int* a; int* b;
a == b;
Ruby == - i.e., do they contain the same value?
int* a; int* b;
*a == *b;
So, in a general case, I'd say that you'd implement == and eql? differently when you can have multiple objects where identity is defined on a subset of their attributes (including their object id). For post authors on a mailing list, to make up a simple example:
class Author
attr :email, :name
def ==(other)
# one email may have many names:
# Matthew Smillie, matt, Matthew B Smillie, ...)
self.email == other.email
end
end
matthew smillie
[1] - a stem is the root form of a word, e.g., 'looking' -> 'look', 'bridges' -> 'bridge' and so forth. Google on 'Porter Stemmer' for a vast amount of background and a popular implementation.
···
On Jun 26, 2006, at 13:09, Alexandru Popescu wrote:
Thanks Robert. I have used that information and I am even linking to
it. The problem I was facing was to explain why == and eql? are both
needed, and when their implementation may be different.