在散列上啪嗒啪嗒 [英] Splat on a hash

查看:152
本文介绍了在散列上啪嗒啪嗒的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  • 一个散列图将其转换为一个数组。



    [* {foo: :bar}]#=> [[:foo,:bar]]



    是否存在一些隐藏机制(如隐式类转换)一个内置的原始特性?


  • 除了一个数组, nil 消失/改变与红宝石1.9下的splat运算符?

  • 一个splat将尝试显式地将对象转换为数组。



    为此,它会发送 to_a 并期望 Array 作为结果。

      class Foo 
    def to_a
    [1,2,3]
    结束
    结束

    a,b,c = * Foo.new
    a#=> 1

    如果对象没有响应 to_a ,那么没有效果,例如 [* 42] == [42]



    许多内建类实现 to_a 。特别是:


    • (因为它们包含 Enumerable

      • Array

      • 哈希

      • 范围

      • IO File

      • Enumerator

      • Enumerator :: Lazy (Ruby 2.0)

      • Set SortedSet


    • (其他班级)

      • NilClass

      • MatchData
      • OpenStruct
      • Struct

      • 时间

      • 矩阵 Vector







        所有这些都可以被打碎:


        $ b $

          match,group,next_group = *Hello,world.match(/(.*),(。*)/)
        组#=> 你好


        • A splat on a hash converts it into an array.

          [*{foo: :bar}] # => [[:foo, :bar]]

          Is there some hidden mechanism (such as implicit class cast) going on here, or is it a built-in primitive feature?

        • Besides an array, are nil and hash the only things that disappear/change with the splat operator under Ruby 1.9?

        解决方案

        A splat will attempt an explicit conversion of an object to an Array.

        To do this, it will send to_a and expect an Array as a result.

        class Foo
          def to_a
            [1,2,3]
          end
        end
        
        a, b, c = *Foo.new
        a # => 1
        

        If the object does not respond to to_a, then there is no effect, e.g. [*42] == [42]

        Many builtin classes implement to_a. In particular:

        • (because they include Enumerable)
          • Array
          • Hash
          • Range
          • IO and File
          • Enumerator
          • Enumerator::Lazy (Ruby 2.0)
          • Set and SortedSet
        • (additional classes)
          • NilClass
          • MatchData
          • OpenStruct
          • Struct
          • Time
          • Matrix and Vector

        All these can thus be splatted:

        match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
        group # => "Hello"
        

        这篇关于在散列上啪嗒啪嗒的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆