diff --git a/ChangeLog b/ChangeLog index c5bb159617..5d91040cdd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Feb 24 07:02:52 2012 Eric Hodel + + * hash.c (Init_Hash): Add section on how objects are used as Hash keys + and how to use custom classes as Hash keys. + Fri Feb 24 06:36:11 2012 Eric Hodel * object.c (rb_obj_eql): Improve equality documentation by adding an diff --git a/hash.c b/hash.c index b908950bb9..6490ab084f 100644 --- a/hash.c +++ b/hash.c @@ -3208,6 +3208,51 @@ env_update(VALUE env, VALUE hash) * @age = params[:age] * end * + * === Hash Keys + * + * Two objects refer to the same hash key when their hash value + * is identical and the two objects are eql? to each other. + * + * A user-defined class may be used as a hash key if the hash + * and eql? methods are overridden to provide meaningful + * behavior. By default, separate instances refer to separate hash keys. + * + * A typical implementation of hash is based on the + * object's data while eql? is usually aliased to the overridden + * == method: + * + * class Book + * attr_reader :author, :title + * + * def initialize(author, title) + * @author = author + * @title = title + * end + * + * def ==(other) + * self.class === other and + * other.author == @author and + * other.title == @title + * end + * + * alias eql? == + * + * def hash + * @author.hash ^ @title.hash # XOR + * end + * end + * + * book1 = Book.new 'matz', 'Ruby in a Nutshell' + * book2 = Book.new 'matz', 'Ruby in a Nutshell' + * + * reviews = {} + * + * reviews[book1] = 'Great reference!' + * reviews[book2] = 'Nice and compact!' + * + * reviews.length #=> 1 + * + * See also Object#hash and Object#eql? */ void