首页 > 解决方案 > 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]}] 

标签: arraysruby

解决方案


再把它包[]起来

您需要一组 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} }

这实际上与您在问题结尾处建议的内容相同,只是没有[].


推荐阅读