我想了解是否有一種使用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)
如果一旦想要調用#perform並使用默認參數,則調用將根本沒有任何參數:
Worker.new.perform()
但是,發送命令i n模塊將* args和** kwargs轉換爲[]和{}。因此,對#perform的調用結束爲send(:perform,[],{}),這會導致ArgumentError參數量不匹配,或者至少發送一個值並不意味着發送([]而不是默認'某事')。
任何想法如何克服這一點?
如果您從等式中刪除kwargs,它將全部[開始工作](http://pastebin.com/qt84MvnR)。 –
謝謝@SergioTulentsev,這確實有效,我讚賞詳細的答案。 嘗試是否有人會想出一個kwargs的想法。 –