February 02, 2005

Default initializer for Hash entries

zenspider made an interesting observation in a comment to my conditional initialization post. He suggests to use the following construct instead:

def initialize
     @map = Hash.new { |hash, key| hash[key] = [] }

def addToList(key, val)
     @map[key] << val

Yes, this is definitely more readable. This goes to show, as I mentioned in my reply to his comment, that when switching between languages we need to *think* in the new language. Performing direct "syntax translation" results the kind of code I posted earlier. The ability to think in a new language comes with practice, just like it does when switching "speakable" languages such as Spanish and English.

In the code above, we're passing a block to the new method of Hash. This block is invoked by the hash object whenever an entry that doesn't exist is requested, and the item returned is the value returned by the block (in this case, the result of evaluating hash[key] = [], that is, []).

The only disadvantage here is that any time we try to get the value associated with a key, an entry is created in the hashmap. So it really depends on how the hash is going to be used in the larger context of the program.

Anyway, it's a cool feature that I'm adding to my bag of tricks.



Anonymous Anonymous said...

Coming from Java to Ruby myself I clearly know what you mean by saying that one has to *think* in the new language. Though "if (aHash['var'] != nil && aHash['var'] != '')" is correct in terms of syntax it is still very Java-minded. A Ruby expert suggested this: if !["",nil].included?(aHash["var"]). Nice :-)

February 02, 2005 1:47 PM  
Anonymous Anonymous said...

ew ew ew... to the post above: use .nil? instead of comparing to nil. And the included version you have is honestly less readable.

for the main entry: As far as the cost of looking up a non-extant value, just use has_key? (or one of its many synonyms). It is cheap, always returns a boolean, and more readable.

-- zenspider

February 03, 2005 12:27 AM  
Blogger crazyloko said...

buy products wholesaleThis phenomenom is typified by China Wholesalersthe rise ofbusiness. Incredible range of products available with China Wholesale “Low Price and High Quality” not only reaches directly to their target clients worldwide but also ensures that wholesale from china from China means margins you cannot find elsewhere and China Wholesale will skyroket your profits.china wholesale productsbuy china wholesalewholesale chinawholesale productsbuy products

October 27, 2009 12:53 AM  
Blogger uwanna said...

gucci replica handbags
men gucci shoes
Gucci men sneakers
Gucci men moccasins
gucci women sneakers
gucci women boots
Gucci men boots
Gucci shop
Gucci bags
Gucci shoes
wholesale gucci shoes
cheap Gucci handbags
Gucci ON sale
Gucci Belts
Gucci small accessories
Gucci hats & scarves
Gucci wallets
Gucci Handbags
Women Gucci shoes
Men Gucci shoes
discount gucci shoes
cheap Gucci shoes

February 04, 2010 9:50 PM  

Post a Comment

Links to this post:

Create a Link

<< Home