複数のパラメーターを渡すruby sendメソッド


129

オブジェクトを作成してメソッドを動的に呼び出そうとする

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

うまくいっているとき

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

間違った数の引数をスローする

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

定義されているランダムクラスは

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

誰かが動的にルビメソッドに複数のパラメータを送信する方法を手伝ってくれる?

回答:


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

または

send(:i_take_multiple_arguments, 25.0, 26.0)

22
*このコンテキストでは「splat」演算子であることに注意してください。
アンドリューマーシャル

8

あなたは代わりsendにそれの同義語で呼び出すことができます__send__

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

ちなみに、ハッシュはparamsのカンマ区切りで次のように渡すことができます。

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

または新しいハッシュ構文:

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

ブラックによると、__send__名前空間に安全です。

「送信は広い概念です:電子メールが送信され、データがI / Oソケットに送信されるなどです。Rubyの組み込みsendメソッドと競合するsendというメソッドをプログラムが定義することは珍しくありません。したがって、Rubyはsend:を呼び出す別の方法を提供します__send__。慣例として、その名前でメソッドを記述する人はいないため、組み込みのRubyバージョンは常に利用可能であり、新しく記述されたメソッドと競合することはありません。奇妙に見えますが、メソッド名の衝突という観点から見ると、通常の送信バージョンよりも安全です。

ブラックは、への呼び出しをラップすることも提案し__send__てい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

参照:黒人、デビッドA. マニング、2009。P.171。

*私はのハッシュ構文を探してここに来た__send__ので、他のグーグルに役立つかもしれません。;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.