2010-12-29 7 views
10

Tengo un método que acepta el operador splat:Envío de elementos de una matriz como argumentos para una llamada al método

def hello(foo, *bar) 
    #... do some stuff 
end 

tengo una matriz con una longitud variable que me gustaría para enviar en este método hola :

arr1 = ['baz', 'stuff'] 
arr2 = ['ding', 'dong', 'dang'] 

me gustaría llamar al método con arr1 y arr2 como argumentos a ese método, pero sigo quedarse atascado en ese bar * se interpreta como una matriz en lugar de argumentos individuales. Para hacer las cosas más divertidas, no puedo cambiar el método de saludo en absoluto.

Estoy buscando algo similar a this SO question pero en ruby.

+1

Algún código más sería muy útil. –

+0

Acepte las respuestas correctas a sus preguntas haciendo clic dentro de la marca de verificación vacía a la izquierda de la respuesta más útil. ¡Gracias! :) –

Respuesta

11

intente llamar como este

hello(arr1, *arr2) 

aquí hay una carrera a través de IRB

irb(main):002:0> def hello(foo, *bar) 
irb(main):003:1> puts foo.inspect 
irb(main):004:1> puts bar.inspect 
irb(main):005:1> end 
=> nil 
irb(main):006:0> arr1 = ['baz', 'stuff'] 
=> ["baz", "stuff"] 
irb(main):007:0> arr2 = ['ding', 'dong', 'dang'] 
=> ["ding", "dong", "dang"] 
irb(main):008:0> hello(arr1, arr2) 
["baz", "stuff"] 
[["ding", "dong", "dang"]] 
=> nil 
irb(main):009:0> hello(arr1, *arr2) 
["baz", "stuff"] 
["ding", "dong", "dang"] 
=> nil 

añadiendo el * a la segunda matriz, que los trata como un gama en lugar de un matriz de una matriz, que es lo que está buscando creo

+0

gracias, eso es exactamente lo que estaba pasando. Incluso cuando llamé a 'bar.class' en los argumentos pasados, estaba viendo una matriz. No pensé que podría ser una matriz de una matriz. – brycemcd

8

Aquí tienes:

hello('Something', *(arr1 + arr2)) 

Esto combinar los arr1 y arr2 arrays y colectivamente pasar desde el segundo argumento en el método.

Ejemplo:

>> def hello(str, *args) 
>> puts str 
>> args.each do |arg| 
?> puts 'Splat: ' + arg 
>> end 
>> end 
=> nil 
>> hello('Hello', *(['programming'] + ['is', 'fun'])) 
Hello 
Splat: programming 
Splat: is 
Splat: fun 
=> ["programming", "is", "fun"] 

El último parámetro de un método puede ser precedida por un asterisco (*), esto indica que más parámetros pueden ser pasados ​​a la función. Esos parámetros se recopilan y se crea una matriz.

Dado que los últimos parámetros se recopilan en una matriz, debe utilizar el operador * para indicar que efectivamente está enviando una matriz al método y que no debe envolver los argumentos en otra matriz.

+0

¿Alguna razón por la que prefiere pegar capturas de pantalla en lugar de código real? –

+0

@Mladen Jablanovic No hay motivo alguno, de hecho si prefieres pegaré el código. –

+3

Gracias. Supongo que es solo cuestión de tiempo cuando alguien realmente imprima el código, escanee el papel impreso y lo adjunte como una imagen. :) –

Cuestiones relacionadas