溅上哈希

saw*_*awa 10 ruby hash null splat ruby-1.9

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

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

    是否有一些隐藏的机制(如隐式类转换)在这里,或者它是一个内置的原始功能?

  • 除了一个数组,nil在Ruby 1.9下使用splat运算符消除/改变的唯一东西是哈希吗?

Mar*_*une 13

splat将尝试将对象显式转换为Array.

为此,它将发送to_a并期望Array结果.

class Foo
  def to_a
    [1,2,3]
  end
end

a, b, c = *Foo.new
a # => 1
Run Code Online (Sandbox Code Playgroud)

如果对象没有响应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"
Run Code Online (Sandbox Code Playgroud)

  • 哦,忘记了`nil`.编辑回答.`NilClass`实现`to_a`(通过返回`[]`),所以这不是特例.没有效果意味着`[*nil]`将是`[nil]`而不是`[]` (2认同)