birden çok parametreyi geçen ruby ​​gönderme yöntemi


129

Dinamik olarak nesneler oluşturmaya ve yöntemleri çağırmaya çalışmak

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

hangisi ne zaman iyi çalışıyor

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

ancak 2 yerine yanlış sayıda bağımsız değişken atmak

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

Tanımlanan Rastgele Sınıf

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

Biri, birden çok parametrenin bir Ruby yöntemine dinamik olarak nasıl gönderileceği konusunda bana yardım edebilir mi?

Yanıtlar:


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

veya

send(:i_take_multiple_arguments, 25.0, 26.0)

22
*Bu bağlamda "uyarıcı" operatörü olduğunu belirtmekte fayda var .
Andrew Marshall

8

Alternatif olarak sendeşanlamlı olarak arayabilirsiniz __send__:

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

Bu arada * hash'leri params olarak virgülle ayırarak geçirebilirsiniz:

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

veya yeni karma sözdizimi:

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

Black'e göre __send__isim alanına göre daha güvenlidir.

"Gönderme geniş bir kavramdır: e-posta gönderilir, veriler G / Ç soketlerine gönderilir vb. Programların, Ruby'nin yerleşik gönderme yöntemiyle çakışan send adlı bir yöntemi tanımlaması alışılmadık bir durum değildir. Bu nedenle, Ruby size send: 'i aramak için alternatif bir yol sunar __send__. Geleneksel olarak, hiç kimse bu adla bir yöntem yazmaz, bu nedenle yerleşik Ruby sürümü her zaman kullanılabilir ve yeni yazılan yöntemlerle asla çakışmaz. Tuhaf görünüyor, ancak yöntem adı çatışmaları açısından düz gönderme sürümünden daha güvenli ”

Siyah ayrıca sarma aramaları önerir __send__içinde 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. Sağlam bir temele sahip Rubyist. Manning, 2009. S. 171.

* Buraya için karma sözdizimi aramak için geldim __send__, bu nedenle diğer Google çalışanları için faydalı olabilir. ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.