4

Ruby 数组中的许多方法在没有参数或块( indexkeep_ifeach等等)的情况下调用时会返回一个枚举器drop_while

  • 什么时候适合使用这种形式的方法,而不是用块调用它们?
4

2 回答 2

5

从文档到Enumerator

大多数方法有两种形式:一种是对枚举中每个项目的内容进行评估的块形式,另一种是返回一个包装迭代的新 Enumerator 的非块形式。

这允许您将枚举器链接在一起。例如,您可以通过以下方式将列表的元素映射到包含索引和元素的字符串:

puts %w[foo bar baz].map.with_index {|w,i| "#{i}:#{w}" }
# => ["0:foo", "1:bar", "2:baz"]

枚举器也可以用作外部迭代器。例如,Enumerator#next 返回迭代器的下一个值,如果 Enumerator 在末尾,则引发 StopIteration。

e = [1,2,3].each   # returns an enumerator object.
puts e.next   # => 1
puts e.next   # => 2
puts e.next   # => 3
puts e.next   # raises StopIteration

我很抱歉复制粘贴,但我无法更好地解释。

于 2012-08-12T11:09:35.747 回答
3

Enumerator 类存在的主要原因是方法链:

array.each.with_object [[], []] { |element, memo| ... }

所以基本上,你不需要担心这个。

于 2012-08-12T11:10:49.677 回答