2008-11-28 6 views
11

Comment puis-je transmettre un nombre variable d'arguments à un rendement. Je ne veux pas passer un tableau (comme le fait le code suivant), je voudrais vraiment les passer comme un nombre programmatique d'args au bloc.Comment est-ce que je peux passer par programme des arguments pour céder dans Ruby?

def each_with_attributes(attributes, &block) 
    results[:matches].each_with_index do |match, index| 
    yield self[index], attributes.collect { |attribute| (match[:attributes][attribute] || match[:attributes]["@#{attribute}"]) } 
    end 
end 

Répondre

13

Utilisez le floc-opérateur * pour mettre le tableau en arguments.

block.call(*array) 

ou

yield *array 
2

Asterisk étendra un tableau aux arguments individuels en ruby:

def test(a, b) 
    puts "#{a} + #{b} = #{a + b}" 
end 

args = [1, 2] 

test *args 
3

Utilisez l'astérisque pour développer un tableau dans ses composants individuels dans une liste d'arguments:

def print_num_args(*a) 
    puts a.size 
end 

array = [1, 2, 3] 
print_num_args(array); 
print_num_args(*array); 

imprimera:

1 
3 

Dans le premier cas, le tableau est passé, dans le second cas, chaque élément est passé séparément. Notez que la fonction appelée doit gérer des arguments variables tels que print_num_args, si elle attend une liste d'arguments de taille fixe et reçoit plus ou moins que prévu, vous obtiendrez une exception.

Questions connexes