gpt4 book ai didi

ruby - 如何在运行时动态创建实例方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:02:06 26 4
gpt4 key购买 nike

[ ruby 1.8]

假设我有:

dummy "string" do
puts "thing"
end

现在,这是对一种方法的调用,该方法具有一个字符串和一个 block 作为输入参数。不错。

现在假设我可以有很多类似的调用(不同的方法名称,相同的参数)。示例:

otherdummy "string" do
puts "thing"
end

现在因为它们做同样的事情,而且它们可能有数百个,所以我不想为所需类中的每个方法创建一个实例方法。我宁愿找到一种聪明的方法来根据一般规则在运行时动态定义方法。

这可能吗?常用的技术有哪些?

谢谢

最佳答案

我特别喜欢使用 method_missing ,尤其是当您要使用的代码在各种方法调用中非常相似时。这是来自 site 的示例- 每当有人调用x.booboo不存在,用 boo 调用 method_missing , boo 的参数,和(可选) block :

class ActiveRecord::Base
def method_missing(meth, *args, &block)
if meth.to_s =~ /^find_by_(.+)$/
run_find_by_method($1, *args, &block)
else
super # You *must* call super if you don't handle the
# method, otherwise you'll mess up Ruby's method
# lookup.
end
end

def run_find_by_method(attrs, *args, &block)
# Make an array of attribute names
attrs = attrs.split('_and_')

# #transpose will zip the two arrays together like so:
# [[:a, :b, :c], [1, 2, 3]].transpose
# # => [[:a, 1], [:b, 2], [:c, 3]]
attrs_with_args = [attrs, args].transpose

# Hash[] will take the passed associative array and turn it
# into a hash like so:
# Hash[[[:a, 2], [:b, 4]]] # => { :a => 2, :b => 4 }
conditions = Hash[attrs_with_args]

# #where and #all are new AREL goodness that will find all
# records matching our conditions
where(conditions).all
end
end

define_method看起来它也适合你,但我对它的经验少于 method_missing .这是来自同一链接的示例:

%w(user email food).each do |meth|
define_method(meth) { @data[meth.to_sym] }
end

关于ruby - 如何在运行时动态创建实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861904/

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