微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – Array()应用于哈希?

最近我偶然发现了“ The Elements of Style in Ruby #3: Make Sure Something Is an Array”.

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 举报,一经查实,本站将立刻删除。

相关推荐