# Weird hash key: what am I asking Ruby to do?

I decided to type the following in irb:
irb(main):010:0> a = {}
=> {}
irb(main):015:0> a[lambda { x } => 5] = 5
=> 5
irb(main):016:0> a
=> {{#Proc:0x028cb304@:15(irb)=>5}=>5}

irb(main):017:0> a = {}
=> {}
irb(main):018:0> a[lambda { x } ] = 5
=> 5
irb(main):019:0> a
=> {#Proc:0x028c2a4c@:18(irb)=>5}

So… In the first example, the hash key is ‘lambda { x } => 5’ .
What on earth does that even mean?

In the second one, the hash key is a lambda. Does that even serve any
purpose beyond just being the key for whatever value I choose to
associate with it?

On Wed, Mar 31, 2010 at 12:32 PM, Aldric G.
[email protected]wrote:

irb(main):018:0> a[lambda { x } ] = 5
=> 5
irb(main):019:0> a
=> {#Proc:0x028c2a4c@:18(irb)=>5}

So… In the first example, the hash key is ‘lambda { x } => 5’ .
What on earth does that even mean?

It means that the key is a hash table which contains a key of the
lambda,
that maps to the value of 5. Notice all three sets of code are the same,
the
keys just get progressively more complicated looking. But if you didn’t
know
what they were, and just considered them to be an object (which they
are),
then they are no longer so complicated, just complicated looking.

key = ‘simple’
hash = Hash.new
hash[ key ] = 5
hash # => {“simple”=>5}
key[ key ] # => “simple”

##########

key = lambda {x}
hash = Hash.new
hash[ key ] = 5
hash # => {#Proc:0x000332e8@-:9=>5}
hash[ key ] # => 5

key = hash # the hash from the previous code block is now the key
hash = Hash.new
hash[ key ] = 5
hash # => {{#Proc:0x000332e8@-:9=>5}=>5}
hash[ key ] # => 5

Josh C. wrote:

On Wed, Mar 31, 2010 at 12:32 PM, Aldric G.
[email protected]wrote:

So… In the first example, the hash key is ‘lambda { x } => 5’ .
What on earth does that even mean?

It means that the key is a hash table which contains a key of the
lambda,
that maps to the value of 5. Notice all three sets of code are the same,
the
keys just get progressively more complicated looking. But if you didn’t
know
what they were, and just considered them to be an object (which they
are),
then they are no longer so complicated, just complicated looking.

Hah! That makes perfect sense. I know what I’m doing next time I see a
code obfuscation contest.

Thanks!

Aldric G. wrote:

So… In the first example, the hash key is ‘lambda { x } => 5’ .
What on earth does that even mean?

You can omit the hash braces in the last arg of a method call, i.e.

fn(a=>b, c=>d) is short for fn({a=>b, c=>d})

foo[bar] is also a method call. It’s short for foo.

irb(main):001:0> h = {}
=> {}
irb(main):002:0> h[1=>2] = 3
=> 3
irb(main):003:0> h
=> {{1=>2}=>3}