如何在Ruby中实现枚举器?

6

例如:

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时应该删除对象?如何手动实现delete_if(在Ruby中)?


[1,2,3,4,5].delete_if.each.each.each.each { |x| x > 3 }你能否详细解释一下这行代码的含义? - Matheus Moreira
为什么 delete_if.each 不同于 eachdelete_if 如何记住应该做什么? - Lai Yu-Hsuan
2个回答

4

您可以查看Rubinius源代码: 可枚举模块

这里是reject方法的示例:

  def reject
    return to_enum(:reject) unless block_given?

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

    ary
  end

1
在实现delete_if时,代码可以验证从yield返回的值,以决定是否从数组中删除给定的条目。
您可以阅读Programming Ruby指南中的实现迭代器以获取更多详细信息,但它看起来应该是这样的:
class Array
  def delete_if
     reject { |i| yield i }.to_a
  end
end

以上使用了yield将数组中的每个项传递给与调用delete_if相关联的块,并隐式地将yield的值返回到外部reject调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接