From: William James Date: 2007-01-21T05:30:10+09:00 Subject: Re: Proper way to either create or append to an array? Phrogz wrote: > Robert Klemme wrote: > > Since you're using a Hash the block constructor is the most elegant > > solution IMHO: > > > > def initialize > > @foo = Hash.new {|h,k| h[k]=[]} > > ... > > end > > To be clear for those unfamiliar with this: any time you ask for the > value of a key that doesn't exist, the block will be called (which > creates a new empty array). This means you can never see this > particular Hash has a key, since: > if @foo[ :bar ] > will always succeed, and create a (possibly unwanted) array instance in > the process. What if foo[:bar] has been assigned a value of false? That method of checking for the presence of a key is too crude even for awk. Note below that the mere attempt to access the value of a key creates an entry for that key if it doesn't already exist. BEGIN { SUBSEP = "^" a[22,"yes"] = 88 a[33] = 99 # The wrong way. if ( a["bar"] ) print "How did 'bar' get here?" # The right way. if ( "foo" in a ) print "'foo' too?" # Any unauthorized entries? for (key in a) print key } --- output ----- 22^yes 33 bar