Mark Woodward
12/2/2007 4:40:00 AM
Hi Yermej,
On Sat, 1 Dec 2007 20:05:45 -0800 (PST)
yermej <yermej@gmail.com> wrote:
> On Dec 1, 8:48 pm, Mark Woodward <markonli...@internode.on.net> wrote:
> > Hi all,
> >
> > could someone explain the line:
> > (STEMS[stem] ||= {})[letter] = 1
> > in the code below?
>
> It's equivalent to:
>
> STEMS[stem] = STEMS[stem] || {}
> STEMS[stem][letter] = 1
The '[letter] = 1' appended to the end was the bit I didn't understand.
Definitely easier to read as your e.g. above. But I guess once you know
the syntax (STEMS[stem] ||= {})[letter] = 1 makes sense. A bit too
'Perlish' for a newbie though ;-)
>
> Where that first line means: if STEMS[stem] isn't defined, assign a
> new Hash to it.
>
> It could also be done like this:
>
> STEMS = Hash.new {|h, k| h[k] = {}} # near the top of your example
> code
>
> STEMS[stem][letter] = 1 # and this in place of the line you asked
> about
>
> Hash.new allows you to use a block to define the behavior of the hash
> if the element isn't found. With no block (as in the example code you
> posted), nil is returned.
thanks,
--
Mark