我正在阅读有关元编程的文章,并且表明您可以在另一种方法中定义一种方法.这是我曾经知道的一段时间,但这让我问自己一个问题:这有什么实际应用吗?在方法中定义方法有什么现实生活中的用途?
例如:
def outer_method def inner_method # ... end # ... end
解决方法
我最喜欢的Metaprogramming示例是动态构建一个方法,然后您将在循环中使用.例如,我有一个我在Ruby中编写的查询引擎,其中一个操作是过滤.有一堆不同形式的过滤器(substring,equals,< =,> =,交集等).天真的做法是这样的:
def process_filter(working_set,filter_type,filter_value) working_set.select do |item| case filter_spec when "substring" item.include?(filter_value) when "equals" item == filter_value when "<=" item <= filter_value ... end end end
但是,如果您的工作集可以变大,那么每个操作都要执行1000秒或1000000次这样的大案例声明,即使每次操作都需要相同的分支.在我的情况下,逻辑比只是一个case语句更多的涉及,所以开销更加糟糕.相反,你可以这样做:
def process_filter(working_set,filter_value) case filter_spec when "substring" def do_filter(item,filter_value) item.include?(filter_value) end when "equals" def do_filter(item,filter_value) item == filter_value end when "<=" def do_filter(item,filter_value) item <= filter_value end ... end working_set.select {|item| do_filter(item,filter_value)} end
现在,一次性分支完成一次,在前面,结果的单用途功能是内循环中使用的一个功能.
实际上,我的真实例子有三个层次,因为工作集和过滤器值的解释都有差异,而不仅仅是实际测试的形式.所以我建立一个item-prep函数和一个filter-value-prep函数,然后构建一个使用这些函数的do_filter函数.
(我实际上使用羔羊,不是defs.)