gpt4 book ai didi

动态创建方法中的 Ruby 动态参数

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:28 24 4
gpt4 key购买 nike

我有以下类型的方法定义:

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)

最佳答案

没有简单的方法可以使用 class_eval 或 define_method 来实现您的要求。由于 method_body 是一个 lambda,它只能访问在它之前定义的局部变量。

method_body = ->{ quux ? bar + baz : bar - baz }
quux = true
method_body.call # undefined local variable or method ‘quux’

quux = true
method_body = ->{ quux ? bar + baz : bar - baz }
method_body.call # undefined local variable or method ‘bar’

我建议您修改您的要求。如果您的方法主体应该是 lambda,请为其定义所有参数。那么这很适合 define_method:

method_body = ->(quux, bar = 0, baz = 0){ quux ? bar + baz : bar - baz }
define_method(method_name, &method_body)

如果你的方法体可以是一个字符串,eval 是唯一的选择:

method_body = "quux ? bar + baz : bar - baz"
eval <<RUBY
def #{method_name} #{arguments}
#{method_body}
end
RUBY

关于动态创建方法中的 Ruby 动态参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15868381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com