2017-02-02 3 views
1

Мне было интересно, возможно ли что-то подобное?Пропустить блок для отображения функции

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

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

Это позволит мне пройти различные блоки, чтобы организовать массив различных способов, как она у меня сейчас не работает, но это что-то вроде это возможно?

ответ

2

Блок может передаваться как аргумент метода, но он должен быть последним. Вы также не можете вызвать метод, прежде чем он был определен:

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

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

Вот небольшой тест:

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

Добавление к ответам Эрика.

Это эквивалентно

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 

Последние избегает материализации блока в качестве объекта.