metodo di invio rubino passando più parametri


129

Cercare di creare oggetti e chiamare metodi in modo dinamico da

Object.const_get(class_name).new.send(method_name,parameters_array)

che funziona bene quando

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

ma lanciando un numero errato di argomenti 1 per 2 per

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

La classe casuale definita è

class RandomClass
def i_am_method_one
    puts "I am method 1"
end
def i_take_arguments(a)
    puts "the argument passed is #{a}"
end
def i_take_multiple_arguments(b,c)
    puts "the arguments passed are #{b} and #{c}"
end
    end

Qualcuno può aiutarmi su come inviare parametri multipli a un metodo ruby ​​in modo dinamico

Risposte:


232
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

o

send(:i_take_multiple_arguments, 25.0, 26.0)

22
Vale la pena notare che *in questo contesto è l'operatore "splat".
Andrew Marshall,

8

Puoi chiamare alternativamente sendcon il suo sinonimo __send__:

r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')

A proposito * puoi passare hash come parametri separati da virgola in questo modo:

imaginary_object.__send__(:find, :city => "city100")

o nuova sintassi hash:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

Secondo Black, __send__è più sicuro dello spazio dei nomi.

"L'invio è un concetto ampio: l'invio di e-mail, i dati vengono inviati ai socket I / O e così via. Non è raro che i programmi definiscano un metodo chiamato send che è in conflitto con il metodo di invio integrato di Ruby. Pertanto, Ruby fornisce un modo alternativo per chiamata inviare: __send__. Per convenzione, nessuno scrive mai un metodo con quel nome, quindi la versione integrata di Ruby è sempre disponibile e non entra mai in conflitto con i metodi appena scritti. Sembra strano, ma è più sicuro della semplice versione di invio dal punto di vista degli scontri metodo-nome "

Nero suggerisce anche le chiamate di avvolgimento ad __send__a if respond_to?(method_name).

if r.respond_to?(method_name)
    puts r.__send__(method_name)
else
    puts "#{r.to_s} doesn't respond to #{method_name}"
end

Rif: Black, David A. Il rubino ben fondato. Manning, 2009. P.171.

* Sono venuto qui per cercare la sintassi dell'hash __send__, quindi potrebbe essere utile per altri googler. ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.