In particular, using inject, the following scripts,
puts (1..5).inject {|x, y| x * y}
andputs (1..5).inject(:*)
,both have output 120
as I expected.
However, the script
print [[1,2], [3,4], [5,6]].map {|x, y| x * y}
has output
[2, 12, 30]
as expected but the script
print [[1,2], [3,4], [5,6]].map(:*)
raises an ArgumentError
:
confused_ruby_map_inject.rb:1:in `map': wrong number of arguments(1 for 0) (ArgumentError)
from confused_ruby_map_inject.rb:1:in `<main>'
Why is this happening, what does :*
do, and what's the most concise way to achieve the result I'm looking for with the second set of scripts?
inject()
can take a block or a symbol, but map()
always takes a block. I think your working map()
is concise enough.
:*
is the symbol name for the multiplication method.
Update: I think your working map()
is fine, but it seems like what you might be looking for is the classic map/reduce, even though it's actually longer:
[[1,2], [3,4], [5,6]].map{|a| a.reduce(:*)}