2017-02-02 1 views
1

Je me demandais si quelque chose comme ça était possible?Passer un bloc à la fonction de carte

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

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

Cela me permettra de passer différents blocs pour organiser le tableau est différentes façons, comme je l'ai ne fonctionne plus, mais est quelque chose comme cela possible?

Répondre

2

Un bloc peut être passé en argument de méthode, mais il doit être le dernier. Vous pouvez également ne pas appeler une méthode avant qu'il a été défini:

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

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

Voici un petit 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

Ajout aux réponses d'Eric.

Ceux-ci sont équivalents

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 

Ce dernier évite matérialisant le bloc comme un objet.