From: Josh Cheek on
[Note: parts of this message were removed to make it a legal post.]

On Wed, Mar 31, 2010 at 12:32 PM, Aldric Giacomoni <aldric(a)trevoke.net>wrote:

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

From: Aldric Giacomoni on
Josh Cheek wrote:
> On Wed, Mar 31, 2010 at 12:32 PM, Aldric Giacomoni
> <aldric(a)trevoke.net>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!
--
Posted via http://www.ruby-forum.com/.

From: Brian Candler on
Aldric Giacomoni 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.[](bar)

irb(main):001:0> h = {}
=> {}
irb(main):002:0> h[1=>2] = 3
=> 3
irb(main):003:0> h
=> {{1=>2}=>3}
--
Posted via http://www.ruby-forum.com/.