I encountered this added method to Array (I don’t recall
the author - sorry ,)
It converts an Array to a Hash by providing a block to compute the
values given the array elements as keys:
class Array
def to_h(&block)
Hash[*self.collect{|v| [v,block.call(v)]}.flatten]
end
end
Without the ‘*’ on self it generates an error:
array2hash.rb:3:in []': odd number of arguments for Hash (ArgumentError) from array2hash.rb:3:into_h’
from array2hash.rb:8
“*” is the “splat” operator when used as a prefix. It takes the
following array, and turns into a list of parameters. Without it the
argument to Hash[] becomes a single Array, while it expects a list of
keys and values.
And yes, it does generalize. Try
p [1,2,3]
p *[1,2,3]
in irb to get a better idea of the result. The first prints a single
array, the second prints three separate values
I encountered this added method to Array (I don’t recall
the author - sorry ,)
It converts an Array to a Hash by providing a block to compute the
values given the array elements as keys:
class Array
def to_h(&block)
Hash[*self.collect{|v| [v,block.call(v)]}.flatten]
end
end
Vidar explained the general concept of the splat fairly well, but the
following clarification of order of operations should help understand
this particular application:
Without the star, the full Method body would be (equivalently):
Hash[[1, 1, 2, 4, 3, 9]]
This complains about an odd number of elements because it’s receiving
only one element – the array. Adding the “splat” in essence removes
the innermost pair of square brackets:
Hash[1, 1, 2, 4, 3, 9]
Hash#[] can then use the list as key/value pairs.
As I said, Vidar explained the operation of the splat well, I just
wanted to point out which array the star was operating on – the
result of the expression “self.collect{ … }.flatten”, not to self
itself (no pun intended).
Jacob F.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.