2011-01-10 12 views
60

Perdone la pregunta principiante, pero decir que tengo una matriz:Dada una serie de argumentos, ¿cómo envío esos argumentos a una función particular en Ruby?

a = [1,2,3] 

y una función de alguna parte; digamos que es una función de ejemplo:

class Ilike 
    def turtles(*args) 
    puts args.inspect 
    end 
end 

¿Cómo se invocan Ilike.turtles con a como si estuviera llamando (Ilike.new).turtles(1,2,3).

Estoy familiarizado con send, pero esto no parece traducir una matriz a una lista de argumentos.

Un paralelo de lo que estoy buscando es el Javascript apply, que es equivalente a call pero convierte la matriz en una lista de argumentos.

Respuesta

113

Como sabe, cuando define un método, puede usar el * para convertir una lista de argumentos en una matriz. De manera similar, cuando llamas a un método puedes usar el * para convertir una matriz en una lista de argumentos. Entonces en su ejemplo usted puede simplemente hacer:

Ilike.new.turtles(*a) 
+4

Fantástico. En función de su excelente respuesta, he encontrado una explicación más detallada de esta técnica en [Wikilibros] (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#Variable_Length_Argument_List.2C_Asterisk_Operator). Esto es realmente perfectamente razonable dada la notación paralela yendo por el otro lado. Oh, Ruby de hecho. También me he dado cuenta de que puede anteponer sus propios argumentos sin incomodar 'a.unshift' inquieto al usar' Ilike.new.turtles (1,2,3, * a) ', aunque el post-envío parece requerir tal maniobra. –

+1

@StevenXu En Ruby 1.9 también puede apuntar a 'postpendiente'. 'a = [1,2]; b = [4,5]; p (0, * a, 3, * b, 6) # => "0 \ n1 \ n2 \ n3 \ n4 \ n5 \ n6" ' – Phrogz

+0

¡Respuesta fantástica! – RubyFanatic

Cuestiones relacionadas