Jeremy Guy
Jeremy Guy

Reputation: 109

Having a hard time understanding & implementing some Ruby code

myitem.inject({}) {|a,b| a[b.one] = b.two; a}

Where:

myitem is a class which holds an array or pair objects (pair objects have two fields in them one and two)

I am not sure what the above code is supposed to do?

Upvotes: 1

Views: 136

Answers (3)

Andrew Grimm
Andrew Grimm

Reputation: 81450

Hash[my_item.map {|object| [object.one, object.two]}]

is another way to do it.

Upvotes: 0

mb14
mb14

Reputation: 22596

It's a pedantic way of writing

h = {}
myitem.each { |b| h[b.one] = b.two }

or to be closer to your original code

a = {}
mytem.each { |b| a[b.one] = b.two }

(I personnaly hate this pattern (and people who use it) as it needs the ; a at the end, losing all the functional aspect of inject. (Using a side-effect function inside a 'functional pattern', and then realizing that the later function (a[..]) doesn't return the expecting object is just wrong, IMO).

Inject is normal use to 'fold' a list into a result like

[1,2,3].inject(0) { |sum, x| sum+x } 
=> 6 # (0+1+2+3)

here sum is the result of the last call to the block, x is each value on the list and 0 is the initial value of sum.

[2,3].inject(10) { |p,x| p*x }
=> 60 # 10*2*3

etc ...

Upvotes: 1

Dave Newton
Dave Newton

Reputation: 160181

Starting with an empty map, set its value for the b.one key to b.two.

In other words, for every item in the "myitem" collection, create a map entry. The key will be an item's "one" value. That map entry's value will be the item's "two" value.

The block given to "inject" receives two parameters. The first is the "accumulator". It's initial value in this case is the empty map passed to "inject". The second parameter is the current item in the collection. In this case, each item in the collection.

The block must return whatever will be used as the next accumulator value, in this case, the map. We want to keep using the same map, so when we're done, the "inject" method will return the map with all the key/value pairs.

Without saving the results of the inject it's a bit worthless.

Upvotes: 1

Related Questions