如何用Array()将Hash转为包含该Hash的数组?
嘿,这个问题我之前踩过坑!让我给你好好解释一下:
首先,为啥Array(h)会返回[[:a, 1], [:b, 2]]呢?因为Ruby里的Kernel#Array方法(也就是你用的Array())处理哈希对象时,会调用哈希的to_a方法——而哈希的to_a本来就是把自己转换成键值对组成的二维数组,这是它的默认行为,目的是把哈希的“键值对集合”特性展开出来。
那要得到你想要的[{a:1,b:2}],有几个简单的办法:
最直接的方式:用数组字面量直接包裹
这是最简单高效的写法,完全符合你的预期:h = {a: 1, b: 2} [h] # => [{a: 1, b: 2}]如果需要类似
Array()的方法调用:用Array.wrap
Ruby标准库提供了Array.wrap方法,它的行为和Kernel#Array不一样——它不会去调用对象的to_a,而是直接把非数组对象包裹成单元素数组:h = {a: 1, b: 2} Array.wrap(h) # => [{a: 1, b: 2}]这个方法在需要统一处理不同类型对象的场景下特别好用,比如处理参数时,不管输入是数组还是单个对象,都能得到数组形式的结果。
自定义封装(可选)
如果有特殊需求,你也可以自己写个小方法来实现:def wrap_as_single_element_array(obj) [obj] end wrap_as_single_element_array(h) # => [{a: 1, b: 2}]
总的来说,日常场景下用[h]就足够啦,简单直接不绕弯~
内容的提问来源于stack exchange,提问作者TieDad
相关产品推荐
相关产品推荐

