只需单击一下即可得到答案:Enumerator的文档:
大多数 [ Enumerator
] 方法 [但可能还有Kernel#to_enum
and ] 有两种形式:一种为枚举中的每个项目评估内容的块形式,以及一种返回新包装迭代Kernel#enum_for
的非块形式。Enumerator
这是适用于这里的第二个:
enum = [4, 1, 2, 0].to_enum(:count) # => #<Enumerator: [4, 1, 2, 0]:count>
enum.class # => Enumerator
enum_ewi = enum.each_with_index
# => #<Enumerator: #<Enumerator: [4, 1, 2, 0]:count>:each_with_index>
enum_ewi.class # => Enumerator
enum_ewi.each {|elem, index| elem == index} # => 2
特别注意 irb 从第三行返回。它继续说,“这允许您将枚举数链接在一起。” 并举map.with_index
个例子。
为什么要停在这里?
enum_ewi == enum_ewi.each.each.each # => true
yet_another = enum_ewi.each_with_index
# => #<Enumerator: #<Enumerator: #<Enumerator: [4, 1, 2, 0]:count>:each_with_index>:each_with_index>
yet_another.each_with_index {|e,i| puts "e = #{e}, i = #{i}"}
e = [4, 0], i = 0
e = [1, 1], i = 1
e = [2, 2], i = 2
e = [0, 3], i = 3
yet_another.each_with_index {|e,i| e.first.first == i} # => 2
(编辑 1:将文档中的示例替换为与该问题相关的一个示例。编辑 2:添加了“为什么停在这里?)