【问题标题】:Splat on a hash散列在散列上
【发布时间】:2012-12-27 12:44:13
【问题描述】:
  • 散列上的 splat 将其转换为数组。

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

    这里是否存在一些隐藏机制(例如隐式类强制转换),或者它是一个内置的原始特性?

  • 除了数组之外,nil 和散列是唯一在 Ruby 1.9 下使用 splat 运算符消失/更改的东西吗?

【问题讨论】:

    标签: ruby hash ruby-1.9 null splat


    【解决方案1】:

    splat 将尝试将对象显式转换为数组。

    为此,它将发送to_a 并期待Array 作为结果。

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

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

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

    • (因为它们包括Enumerable
      • Array
      • Hash
      • Range
      • IOFile
      • Enumerator
      • Enumerator::Lazy (Ruby 2.0)
      • SetSortedSet
    • (附加类)
      • NilClass
      • MatchData
      • OpenStruct
      • Struct
      • Time
      • MatrixVector

    所有这些都可以被喷溅:

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

    【讨论】:

    • Splatted nil 在 Ruby 1.9 下消失,这不适合没有效果的情况,所以我猜这是唯一的例外。我说的对吗?
    • 哦,忘了nil。编辑答案。 NilClass 实现了to_a(通过返回[]),所以这不是特例。没有效果意味着[*nil] 将是[nil] 而不是[]
    猜你喜欢
    • 2012-11-10
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2016-09-04
    • 2012-08-03
    • 2011-03-13
    • 2014-05-19
    相关资源
    最近更新 更多