arrays - Ruby:0 处的错误元素类型符号(预期数组)
问题描述
我想知道为什么尝试将此数组转换为哈希会导致错误:
[:a, [1,2,3]].to_h
=> TypeError: wrong element type Symbol at 0 (expected array)
Hash[ [:a, [1,2,3]] ]
=> ArgumentError: invalid number of elements (3 for 1..2)
数组散列两项。所以它应该很容易转换为键/值对,这就是哈希。
我有一个看起来像这样的集合:
[ [:a, [1,2,3]], [:b, [4,5,6]] ]
我只想让它成为一个哈希数组:
[ [:a, [1,2,3]], [:b, [4,5,6]] ].collect {|collection| Hash[collection] }
=> ArgumentError: invalid number of elements (3 for 1..2)
为什么不能将包含两个项目的数组转换为键/值对?
我可以做这样的事情:
arr.collect {|item| { item[0] => item[1] } }
=> [{:a=>[1, 2, 3]}, {:b=>[4, 5, 6]}]
解决方案
再把它包[]
起来
您需要一组 pairs,因为其中一个Hash
可以包含许多,并且该功能反映在其构造函数接受的内容中。一对是具有 2 个元素的数组。
Hash[ [:a, [1,2,3]] ]
这是Hash.[]
对单对 [:a, [1,2,3]]
的调用。
要使其成为一对数组,请再次包装,获取[[:a, [1,2,3]]]
或
Hash[[[:a, [1,2,3]]]
# ↑↑↑
# ||\_pair
# |\_array of pairs
# \_call to Hash.[]
这里方括号的数量令人作呕。
如果您的最终目标是一个哈希数组,每个哈希都是一对,您可以在块参数中使用解构,如下所示:
[ [:a, [1,2,3]], [:b, [4,5,6]] ].collect {|(a, b)| {a => b} }
这实际上与您在问题结尾处建议的内容相同,只是没有[]
.
推荐阅读
- php - Ubuntu LEMP 堆栈中的 Laravel 502 错误网关
- c++ - 如何阻止角色在控制台中移动?
- java - 一旦我运行我的 Appium 脚本,线程“主”java.lang.NoClassDefFoundError 中的异常
- javascript - 无法使用 Ace 作为 RequireJS 依赖项
- select - 触发选择选项(选项包含多个单词)
- spring-boot - 带有 jsp 视图和 Swagger-ui 的 Spring-boot Spring-MVC 应用程序
- java - 跨类共享相同的变量
- r - 如何将具有 4 个级别的有序分类变量转换为定量变量
- arrays - 查找并返回数组中出现频率最高的元素
- security - ElectronJS:在 DOM 中加载用户本地文件的最安全方法是什么(