例如:
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
?
答案 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}调用。