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:[email protected]:15(irb)=>5}=>5}

irb(main):017:0> a = {}
=> {}
irb(main):018:0> a[lambda { x } ] = 5
=> 5
irb(main):019:0> a
=> {#Proc:[email protected]: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:[email protected]: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:[email protected]: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:[email protected]: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}

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs