溅上哈希

时间:2013-01-13 12:35:49

标签: ruby hash ruby-1.9 null splat

  • 哈希上的splat将其转换为数组。

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

    这里有一些隐藏机制(例如隐式类强制转换),还是内置的原始功能?

  • 除了数组之外,还有nil和散列在Ruby 1.9下使用splat运算符消失/改变的唯一内容吗?

1 个答案:

答案 0 :(得分:12)

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"