Ruby的動態參數我有以下一種方法定義的:在動態創建的方法
method_name = :foo
method_arguments = [:bar, :baz]
method_mandatory_arguments = {:quux => true}
method_body = ->{ quux ? bar + baz : bar - baz }
所以我希望得到一個真正的方法。但是define_method沒有任何動態定義方法參數的可能性。我知道使用class_eval的另一種方式,但我知道比定義方法class_eval要慢得多define_method。 我如何有效地存檔這個?
我做了一些基準測試中軌控制檯:
class Foo; end
n = 100_000
Benchmark.bm do |x|
x.report('define_method') do
n.times { |i| Foo.send(:define_method, "method1#{i}", Proc.new { |a, b, c| a + b + c }) }
end
x.report('class_eval') do
n.times { |i| Foo.class_eval %Q{ def method2#{i}(a, b, c); a + b + c; end } }
end
end
所以我已經得到了以下結果:
user system total real
define_method 0.750000 0.040000 0.790000 ( 0.782988)
class_eval 9.510000 0.070000 9.580000 ( 9.580577)
'class_eval'對我來說很有意義。性能真的是一個問題嗎?很難想象它會是什麼用例。 – 2013-04-07 22:21:57
你可以讓你的define_method塊接受可變參數,然後根據你在閉包中捕獲的參數元數據解釋args數組。 – dbenhur 2013-04-07 22:41:15
@dbenhur,好的,但在這種情況下,事實上我有一種方法可以實現乘法行爲,所以我必須通過手工實現基本參數行爲(參數存在,默認參數等)。這是我想要避免的。 – freemanoid 2013-04-08 07:11:34