加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:09:52 所属栏目:百科 来源:网络整理
导读:我正在阅读有关元编程的文章,并且表明您可以在另一种方法中定义一种方法.这是我曾经知道的一段时间,但这让我问自己一个问题:这有什么实际应用吗?在方法中定义方法有什么现实生活中的用途? 例如: def outer_method def inner_method # ... end # ... end
我正在阅读有关元编程的文章,并且表明您可以在另一种方法中定义一种方法.这是我曾经知道的一段时间,但这让我问自己一个问题:这有什么实际应用吗?在方法中定义方法有什么现实生活中的用途?

例如:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读