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)?
在执行delete_if
时,代码可以验证从yield
返回的值,以决定是否从数组中删除给定条目。
可以编程的Ruby指南了解更详细的阅读Implementing Iterators,但它会看起来像:
class Array
def delete_if
reject { |i| yield i }.to_a
end
end
上述用途yield
每个项目传递数组与调用相关的块delete_if
,并隐含地将yield
的值返回给外部的reject
调用。
可以看看该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,2,3,4,5] .delete_if.each .each.each.each {| x | x> 3}'你能否详细说明这一点? –
为什么'delete_if.each'与'each'不一样? “delete_if”怎么记得它应该怎么做? –