11
  • ハッシュの感嘆符は、それを配列に変換します。

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

    ここで何らかの隠しメカニズム (暗黙のクラス キャストなど) が行われているのでしょうか、それとも組み込みのプリミティブ機能ですか?

  • 配列のほかに、nilRuby 1.9 で splat 演算子で消えたり変更されたりするのはハッシュだけですか?

4

1 に答える 1

14

スプラットは、オブジェクトから配列への明示的な変換を試みます。

これを行うために、結果としてを送信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(ルビー2.0)
    • SetSortedSet
  • (追加クラス)
    • NilClass
    • MatchData
    • OpenStruct
    • Struct
    • Time
    • MatrixVector

したがって、これらすべてを飛び散らせることができます。

match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
于 2013-01-14T01:45:32.777 に答える