Ruby:在另一种方法中定义一个方法有什么实际用途?

我正在阅读有关元编程的文章,并且表明您可以在另一种方法中定义一种方法.这是我曾经知道的一段时间,但这让我问自己一个问题:这有什么实际应用吗?在方法中定义方法有什么现实生活中的用途?

例如:

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.)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...