首页 > 解决方案 > 如果 each 是 Enumerable 并且 with_index 是 Enumerable,那么为什么 each 可以迭代数组但不能 with_index?

问题描述

我认为这个问题是不言自明的:如果each是一个 Enumerable 并且with_index是一个 Enumerable,那么为什么可以each迭代数组但不能with_index

我将提供一个示例:

 alphabet =  [:a, :b, :c]
 => [:a, :b, :c] 
alphabet.each.class
 => Enumerator 
alphabet.each.with_index.class
 => Enumerator 
alphabet.each
 => #<Enumerator: [:a, :b, :c]:each> 
2.1.2 :036 > alphabet.with_index
NoMethodError: undefined method `with_index' for [:a, :b, :c]:Array

对我来说,两者都是 Enumerables 似乎不直观,但each可以 response_to Array 但with_index不能。因此,当我尝试构建这些 Enumerables 时,我会变得健忘:

alphabet.each.with_index(1).reduce({}) do |acc, (letter,i)|
end

有时我会犯这个错误:

alphabet.with_index(1).reduce({}) do |acc, (letter,i)|
end

忘记with_index必须链接到的依赖项each

标签: ruby

解决方案


each不是一个Enumerable,它返回一个Enumerator(注意拼写) which is_a?(Enumerable)

为什么[1,2,3].with_index不起作用?因为with_index是 的实例方法Enumerator,而不是 的方法Enumerable


推荐阅读