2011-10-07 68 views
6

例如:如何在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)?

+0

'[1,2,3,4,5] .delete_if.each .each.each.each {| x | x> 3}'你能否详细说明这一点? –

+0

为什么'delete_if.each'与'each'不一样? “delete_if”怎么记得它应该怎么做? –

回答

1

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

可以编程的Ruby指南了解更详细的阅读Implementing Iterators,但它会看起来像:

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

上述用途yield每个项目传递数组与调用相关的块delete_if,并隐含地将yield的值返回给外部的reject调用。

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