Ruby-Send-Methode, die mehrere Parameter übergibt

129

Der Versuch, Objekte zu erstellen und Methoden dynamisch von aufzurufen

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

Das funktioniert gut, wenn

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

aber falsche Anzahl von Argumenten 1 für 2 für werfen

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

Die definierte Zufallsklasse ist

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

Kann mir jemand helfen, wie man mehrere Parameter dynamisch an eine Ruby-Methode sendet

Rails4Sandeep
quelle

Antworten:

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

oder

send(:i_take_multiple_arguments, 25.0, 26.0)
Seanny123
quelle
22
Es könnte erwähnenswert sein, dass der *in diesem Zusammenhang der "Splat" -Operator ist.
Andrew Marshall
8

Sie können alternativ sendmit dem Synonym anrufen __send__:

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

Übrigens * können Sie Hashes als durch Kommas getrennte Parameter übergeben:

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

oder neue Hash-Syntax:

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

Laut Black __send__ist der Namespace sicherer.

„Senden ist ein weit gefasstes Konzept: E-Mails werden gesendet, Daten werden an E / A-Sockets gesendet und so weiter. Es ist nicht ungewöhnlich, dass Programme eine Methode namens send definieren, die im Widerspruch zu Rubys integrierter Sendemethode steht. Daher bietet Ruby eine alternative Möglichkeit, send aufzurufen : __send__. Konventionell schreibt niemand eine Methode mit diesem Namen, daher ist die integrierte Ruby-Version immer verfügbar und gerät nie in Konflikt mit neu geschriebenen Methoden. Es sieht seltsam aus, ist aber unter dem Gesichtspunkt von Zusammenstößen zwischen Methodennamen sicherer als die einfache Sendeversion. “

Schwarz schlägt auch Wickel Anrufe __send__in 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

Ref: Black, David A. Der fundierte Rubyist. Manning, 2009. S.171.

* Ich bin hierher gekommen, um nach Hash-Syntax zu suchen __send__, daher kann dies für andere Googler nützlich sein. ;)

Tony Cronin
quelle