私の理解では、非配列オブジェクトの単一のスプラットがto_a
要素を呼び出して分離します。はnil.to_a
と定義されているため[]
、次の変換が行われます。
[:foo, *nil, :bar]
# => [:foo, *nil.to_a, :bar]
# => [:foo, *[], :bar]
# => [:foo, :bar]
類推すると、非ハッシュ オブジェクトのダブル スプラットが呼び出さto_h
れ、キーと値のペアが分離されると考えました。はnil.to_h
であると定義されているため{}
、次の変換が行われると予想していました。
{"foo" => 1, **nil, "bar" => 2}
# => {"foo" => 1, **nil.to_h, "bar" => 2}
# => {"foo" => 1, **{}, "bar" => 2}
# => {"foo" => 1, "bar" => 2}
しかし実際には、エラーが発生します: no implicit conversion of nil into Hash
. なぜそのように振る舞うのですか?
編集私はデザインの背後にある理由について尋ねていません. ダブルスプラに関して私の考えが間違っているところを尋ねています。