Pass a block to map function

3.3k Views Asked by At

I was wondering if something like this was possible?

info = arrange_info({|x| [x.name, x.number]}, info_array)

def arrange_info(block, info)
    info.map(block).to_h
end

This would allow me to pass different blocks to arrange the array is different ways, how I have it now doesn't work, but is something like this possible?

2

There are 2 best solutions below

0
On BEST ANSWER

A block can be passed as a method argument, but it needs to be the last one. You also cannot call a method before it has been defined :

def arrange_info(info, &block)
  info.map(&block).to_h
end

info = arrange_info(info_array){|x| [x.name, x.number]}

Here's a small test :

class X
  def initialize(name, number)
    @name = name
    @number = number
  end

  attr_reader :name, :number
end

def arrange_info(info, &block)
  info.map(&block).to_h
end

info_array = [X.new('a', 1), X.new('b', 2)]

p info = arrange_info(info_array) { |x| [x.name, x.number] }
#=> {"a"=>1, "b"=>2}
0
On

Adding to Eric's answers.

These are equivalent

def arrange_info(info, &block)
  info.map(&block).to_h
end

def arrange_info(info) # takes a block
  info.map { |each| yield each }.to_h
end

The latter avoids materializing the block as an object.