Я пытаюсь понять, есть ли способ использовать send для вызова метода с динамическими аргументами (* args, ** kwrags), в то время как метод имеет только аргументы по умолчанию.Как отправить динамические аргументы методам с аргументами по умолчанию
Учитывая следующий класс:
class Worker
def perform(foo='something')
# do something
end
end
У меня есть модуль, который необходимо проверить некоторые условия. Если условия не выполняются, то метод #perform должен работать:
module SkippableWorker
def self.included(base)
base.class_eval do
alias_method :skippable_perform, :perform
define_method :perform do |*args, **keyword_args|
return if skip?
self.send(:skippable_perform, *args, **keyword_args)
end
define_method :skip? do
# checks whether to skip or not
end
end
end
end
После того, как в том числе модуля в классе работника, я сталкиваюсь с проблемой в команду отправки модуля:
self.send(:skippable_perform, *args, **keyword_args)
If когда хочет вызвать #perform и использовать аргументы по умолчанию, то вызов будет выполнен без каких-либо аргументов вообще:
Worker.new.perform()
Но команда посыла я n модуль переводит * args и ** kwargs в [] и {}. Таким образом, вызов #perform заканчивается для отправки (: выполнить, [], {}), что вызывает несоответствие суммы аргумента ArgumentError для аргументов или, по крайней мере, отправляет значение, которое не означает отправить ([] вместо default 'something').
Любые идеи, как преодолеть это?
Если вы удалите kwargs из уравнения, все [начинает работать] (http://pastebin.com/qt84MvnR). –
Благодаря @SergioTulentsev, это действительно работает, и я ценю подробный ответ. Попытка, если кто-нибудь придумает идею для kwargs. –