例如:
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 中)?
例如:
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 中)?
可以看一下Rubinius源码:可枚举模块
这是拒绝方法的示例:
def reject
return to_enum(:reject) unless block_given?
ary = []
each do |o|
ary << o unless yield(o)
end
ary
end
在 的实现中delete_if
,代码可以验证从返回的值yield
来决定是否从数组中删除给定的条目。
您可以阅读Programming Ruby 指南中的实现迭代器以获取更多详细信息,但它看起来像:
class Array
def delete_if
reject { |i| yield i }.to_a
end
end
上面用于yield
将数组中的每个项目传递给与调用关联的块delete_if
,并隐式地将 的值返回yield
给外部reject
调用。