没有块的Ruby Hash / Array delete_if

时间:2011-05-27 05:44:18

标签: ruby

根据Ruby Hash / Array文档,如果没有给出块,delete_if方法返回一个枚举器。这有用吗?有人可以举例说明这种模式吗?

2 个答案:

答案 0 :(得分:8)

Enumerator上定义了一些为迭代器提供灵活性的方法。我经常使用的一种方法是with_index

p %w[a b c d e f].delete_if.with_index{|_, i| i.even?}
# => ["b", "d", "f"]

如果要在没有Enumerator类的情况下完成此操作,则必须定义所有类型的方法,包括delete_if_with_index,这不是一件好事。

答案 1 :(得分:3)

枚举器只允许您稍后运行该块。例如,如果您有一个专门处理删除的方法,如果有几个不同的对象,您可以将它传递给枚举器。

在下面的示例中,它将打印 1,3,5

arr = [0,1,2,3,4,5]
enumerator = arr.delete_if
enumerator.each { |el| el.even? }
puts arr.join(', ')