0
我想元編程的方式來定義基於謂詞方法的爆炸方法。現在,我有行爲我想和method_missing
工作:在Ruby中基於現有方法的定義方法
class PredicateBang
def true?
true
end
def false?
false
end
def method_missing(method, *args, &block)
if bang_match = /\A([^?]+)!\z/.match(method.to_s)
predicate_method = :"#{bang_match[1]}?"
if respond_to?(predicate_method)
unless send(predicate_method, *args, &block)
raise "#{predicate_method} is false"
end
return
end
end
super.method_missing(method, *args, &block)
end
end
PredicateBang.new.true!
PredicateBang.new.false! # false? is false (RuntimeError)
取而代之的首要method_missing
,但是,我想通過循環instance_methods(false)
和使用define_method
動態定義的方法來創建對任何一個爆炸方法方法以一個帶有匹配參數的問號結束,但我不知道如何反思方法的所有細節。
Method#parameters
看起來像是一個體面的第一步,但我不知道如何翻譯,以阻止參數或處理默認值。
超級酷。我從來不知道你可以傳遞一個圖示作爲塊參數。我猜測沒有辦法反映默認值呢? – fny 2015-03-02 22:10:10
'SomeClass.instance_method(:method_name).parameters'將爲您提供該方法名稱的參數列表,其中包括哪些是必需的,哪些是可選的,但不會給您默認值。 – mikej 2015-03-02 22:25:22
我最終將這個用例演化成了我的第一個發佈的gem,[Interrobang](https://github.com/fny/interrobang)。謝謝您的幫助! – fny 2015-04-03 05:17:20