3

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?

user2320239
  • 1,021
  • 2
  • 18
  • 43

2 Answers2

7

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}
Eric Duminil
  • 52,989
  • 9
  • 71
  • 124
2

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.

akuhn
  • 27,477
  • 2
  • 76
  • 91