例如:
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源代码: 可枚举模块
这里是reject方法的示例:
def reject
return to_enum(:reject) unless block_given?
ary = []
each do |o|
ary << o unless yield(o)
end
ary
end
delete_if
时,代码可以验证从yield
返回的值,以决定是否从数组中删除给定的条目。class Array
def delete_if
reject { |i| yield i }.to_a
end
end
yield
将数组中的每个项传递给与调用delete_if
相关联的块,并隐式地将yield
的值返回到外部reject
调用。
[1,2,3,4,5].delete_if.each.each.each.each { |x| x > 3 }
你能否详细解释一下这行代码的含义? - Matheus Moreiradelete_if.each
不同于each
?delete_if
如何记住应该做什么? - Lai Yu-Hsuan