Christian Neukirchen wrote:
> Hugh Sasse <hgs / dmu.ac.uk> writes:
> 
>> On Thu, 15 Sep 2005, Christian Neukirchen wrote:
>> 
>>> This seems to be the canonical way to define compund hashes:
>>> 
>>> class Student
>>>  def hash
>>>    [@forename, @surname, @birth_dt, @picture, @coll_status].hash
>>>  end
>>> end
>> 
>> That does seem to preserve the properties I need for strings, and is
>> probably cheaper than MD5sums.
>>> 
>>          [...]
>>> 
>>> Set uses a Hash to store the objects.
>>> 
>>> That said, I think it would be nice to have something along this in
>>> the stdlib:
>>> 
>>> class Student
>>>  equal_compares :@forename, :@surname, :@birth_dt, :@picture,
>>> :@coll_status end
>>> 
>>> Above call should result in appropriate definitions of ==, eql? and
>> 
>> I don't know how it could know how to create the different
>> definitions correctly given a completely open spec as to what the
>> vars are.
> 
> Well, you just list all instance variables that define the
> object... if they are the same, the objects are eql?.
> 
>>> hash.  (Something like "ordered_by" would be pretty useful too.)
>> 
>> I think that could be tricky too.
> 
> In the end, [*fields] <=> [*other.fields] does the job.

You can also steal the code from RCR 293 for a general solution:
http://rcrchive.net/rcr/show/293

Kind regards

    robert