2011-10-07 100 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