Ответ 1
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator
или
send(:i_take_multiple_arguments, 25.0, 26.0)
Попытка создания объектов и динамических вызовов методом
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
Может ли кто-нибудь помочь мне в том, как динамически отправлять параметры в рубиновый метод
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator
или
send(:i_take_multiple_arguments, 25.0, 26.0)
Вы можете поочередно вызывать 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])
Согласно Black, __send__
безопаснее для пространства имен.
"Отправка - это широкая концепция: отправляется сообщение электронной почты, данные отправляются в сокеты ввода-вывода и т.д. Нередко для программ для определения метода, который называется send, который конфликтует с встроенным методом отправки Rubys, Ruby дает вам альтернативный способ вызова send:
__send__
. По соглашению никто никогда не пишет метод с таким именем, поэтому встроенная версия Ruby всегда доступна и никогда не вступает в конфликт с новыми написанными методами., но его безопаснее, чем простая версия отправки с точки зрения конфликтов имен методов"
Black также предлагает обматывать вызовы __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__
, поэтому может быть полезен другим гуглерам.;)