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等)的方式处理哈希.我根本不希望针对不同的情况进行不同的处理. 解决方法
你的假设是错误的. > arg.to_ary 例子: Array(1) #=> [1] 这是因为(3).没有Fixnum#to_ary或Fixnum#to_a Array([1,2]) #=> [1,2] 由于(1),这不返回[[1,2]]. Array(nil) #=> [] 由于(2),这不会返回[nil].没有NilClass#to_ary但是有 Array({a: :b}) #=> [[:a,:b]] 像Array(nil)一样,由于(2),它不会返回[{a :: b}].没有Hash#to_ary但是有 Array(Time.now) #=> [33,42,17,22,8,2013,4,234,true,"CEST"] 这是 结论: Kernel#Array按预期工作,Hash#to_a是罪魁祸首. (或一般来说)
散列和数组是不同的对象.您可以检查类型(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 请参阅备注实现的注释. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – 什么是*(uint32_t *)
- 连接Oracle数据库时报ORA-12541:TNS:无监听程序的图文解决教
- Fatal error: Uncaught SoapFault exception: [Client] loo
- C#获取任务栏显示进程的方法
- c – Endianness和C API:特别是OpenSSL
- ruby-on-rails-3 – Rails3 fields_for文本哈希:不按预期工
- ruby-on-rails – 从Elastic Beanstalk上托管的Rails应用程
- cocos2d-x 坐标系
- 在Unity3D中使用Mono.XML读取XML文件
- ios – Storyboard状态栏后面的内容