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

前端之家收集整理的这篇文章主要介绍了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.)

猜你在找的Ruby相关文章