我有以下类型的方法定义:
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慢得多。我怎样才能有效地归档这个?
我在 Rails 控制台中做了一些基准测试:
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)