如何在Ruby中实现枚举器?

时间:2011-10-07 19:34:57

标签: ruby enumerator

例如:

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

2 个答案:

答案 0 :(得分:4)

您可以查看Rubinius源代码:enumerable module

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

  def reject
    return to_enum(:reject) unless block_given?

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

    ary
  end

答案 1 :(得分:1)

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

您可以在编程Ruby指南中阅读Implementing Iterators以获取更多详细信息,但它看起来像:

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

以上使用yield将数组中的每个项目传递给与delete_if调用关联的块,并隐式返回yield的值到外{{1}调用。