【问题标题】:How to implement an enumerator in Ruby?如何在 Ruby 中实现枚举器?
【发布时间】:2017-03-09 19:21:55
【问题描述】:

例如:

a = [1,2,3,4,5]
a.delete_if { |x| x > 3 }

相当于:

a = [1,2,3,4,5]
a.delete_if.each.each.each.each { |x| x > 3 }

我知道a.delete_if 返回一个枚举器。但是当each 块返回true 时,它​​怎么知道它应该删除对象呢?如何手动(以及在 Ruby 中)实现delete_if

【问题讨论】:

  • [1,2,3,4,5].delete_if.each.each.each.each { |x| x > 3 } 您能否详细说明这一行?
  • 为什么delete_if.eacheach 不一样? delete_if 怎么记得应该怎么做?

标签: ruby enumerator


【解决方案1】:

可以看一下Rubinius源码:enumerable module

这里是拒绝方法的一个例子:

  def reject
    return to_enum(:reject) unless block_given?

    ary = []
    each do |o|
      ary << o unless yield(o)
    end

    ary
  end

【讨论】:

    【解决方案2】:

    delete_if的实现中,代码可以验证yield返回的值来决定是否从数组中删除给定的条目。

    您可以阅读 Programming Ruby 指南中的 Implementing Iterators 了解更多详细信息,但它看起来类似于:

    class Array
      def delete_if
         reject { |i| yield i }.to_a
      end
    end
    

    上面使用yield将数组中的每一项传递给与delete_if调用关联的块,并将yield的值隐式返回给外部reject调用。

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 2018-02-23
      • 2010-11-28
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多