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」怎麼記得它應該怎麼做? –