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 中)?

4

2 回答 2

4

可以看一下Rubinius源码:可枚举模块

这是拒绝方法的示例:

  def reject
    return to_enum(:reject) unless block_given?

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

    ary
  end
于 2011-10-07T19:56:27.283 回答
1

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

您可以阅读Programming Ruby 指南中的实现迭代器以获取更多详细信息,但它看起来像:

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

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

于 2011-10-07T19:53:48.987 回答