метод рубінової відправки, що передає декілька параметрів


129

Спроба створити об'єкти та методи виклику динамічно

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

що добре працює, коли

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

але викидаючи неправильну кількість аргументів 1 для 2 для

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')

До речі, * ви можете передавати хеші як парами, розділені так, як так:

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

або новий синтаксис хеша:

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

За словами Блек, __send__безпечніше для простору імен.

"Надсилання - це широке поняття: надсилається електронна пошта, дані надсилаються в сокети вводу / виводу тощо. Не рідкість у програмах визначати метод, який називається send, який суперечить вбудованому методу відправки Ruby. Тому, Ruby дає вам альтернативний спосіб відправки виклику: __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

Реф: Чорний, Девід А. Добре обґрунтований рубіст. Меннінг, 2009. С.171.

* Я прийшов сюди шукати хеш-синтаксис для __send__, тому може бути корисним для інших googlers. ;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.