ruby - 如果 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
。
解决方案
each
不是一个Enumerable
,它返回一个Enumerator
(注意拼写) which is_a?(Enumerable)
。
为什么[1,2,3].with_index
不起作用?因为with_index
是 的实例方法Enumerator
,而不是 的方法Enumerable
。
推荐阅读
- input - Brainf*** 中如何处理输入?
- java - org.sqlite.SQLiteException:[SQLITE_NOTADB] 打开的文件不是数据库文件(文件已加密或不是数据库)[NETBEANS]
- c++ - 如何使用 BFS 重建路径
- reactjs - Loopback 4 提供的静态文件未在 kubernetes 上显示
- numpy - 张量大小未匹配损失函数
- python - 在 Python 上使用 Watchdog 时出现回溯错误
- javascript - 错误:
属性 d:预期数字 D3 - java - 我可以直接在浏览器中打开 .ftl 而不经过应用程序周期吗?
- git - 如何查看 git log 和 git status
- swift - 如何从类邮件中关闭 MFMailComposeViewController?