TL; DR:Ruby中的Method Array()将您放入的任何内容转换为数组并尝试猜测正确的结果应该是什么:
Array(1) # => [1] Array([1,2]) # => [1,2] Array(nil) # => []
那么Array({a :: b})会返回什么?我假设它返回一个数组,其中哈希值为:[{a :: b}].
但是,哈希直接转换为数组:[:a,:b].
我不只是想将哈希放入数组([{a :: b}]).无论我放入什么内容,我都希望能够返回一个数组.All()已经这样做了,但它以一种我不期望的方式将哈希转换为数组.
所以,基本上功能应如下所示:
NewFancyArrayMethod({a: :b}) # => [{a: :b}] NewFancyArrayMethod([{a: :b},{c: :d}]) # => [{a: :b},{c: :d}]
第二部分已由Array()完成.
我知道我可以做一些像values = [values]的东西,除非values.is_a?数组,就像文章指出的那样.但是,我宁愿有一个方法从Array中抽象出这个转换,就像Array()已经做的那样.唯一的问题是Array()以不同于任何其他“单个”值(String,Integer,Object等)的方式处理哈希.我根本不希望针对不同的情况进行不同的处理.
解决方法
So what does
Array({a: :b})
return? I would assume it returns an array with the hash as a value:[{a: :b}]
.
你的假设是错误的. Kernel#Array
通过尝试(按此顺序)转换参数arg:
> arg.to_ary
> arg.to_a
>最后创建[arg]
例子:
Array(1) #=> [1]
这是因为(3).没有Fixnum#to_ary或Fixnum#to_a
Array([1,2]) #=> [1,2]
由于(1),这不返回[[1,2]]. Array#to_ary
回归自我
Array(nil) #=> []
由于(2),这不会返回[nil].没有NilClass#to_ary但是有NilClass#to_a
:“总是返回一个空数组.”
Array({a: :b}) #=> [[:a,:b]]
像Array(nil)一样,由于(2),它不会返回[{a :: b}].没有Hash#to_ary但是有Hash#to_a
:“将hsh转换为[key,value]数组的嵌套数组.”
Array(Time.Now) #=> [33,42,17,22,8,2013,4,234,true,"CEST"]
这是Time#to_a
返回……“十个元素的时间值数组”
结论:
Kernel#Array按预期工作,Hash#to_a是罪魁祸首. (或一般来说)
I’d like to have a functionality,that returns an array no matter what I put in.
散列和数组是不同的对象.您可以检查类型(Kernel#Array也这样做):
def hash_to_array(h) h.is_a?(Array) ? h : [h] end
或者扩展Hash(甚至是Object)和Array:
class Hash # or Object def my_to_a [self] end end class Array def my_to_a self end end
请参阅备注实现的注释.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。