2

私の理解では、非配列オブジェクトの単一のスプラットが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. なぜそのように振る舞うのですか?

編集私はデザインの背後にある理由について尋ねていません. ダブルスプラに関して私の考えが間違っているところを尋ねています。

4

2 に答える 2

3

パターンを認識し、物事を予測するのは人間の超能力です。ただし、常に正しいとは限りません。これは一例です。Ruby は、splat と double splat で一貫性がありません。あなたの考え方は「覚える」ための良い方法ですが、Ruby がスプラットで動作する方法とはまったく異なります。

詳細については、このバグ レポートを参照してください。このバグ レポートでは、Ruby の作成者である Matz は、nilダブル スプラットをnil.

于 2015-12-07T03:41:52.443 に答える
1

機能する理由*nilは、splat 演算子が に応答してto_anil.to_a返すものすべてに作用するため[]です。**nil機能しない理由は、nilが に応答しないためです。to_hashto_a

この動作が必要な場合は、次のようにモンキー パッチを適用できますNilClass

class NilClass
  def to_hash
    {}
  end
end

{ "foo" => 1, **nil, "bar" => 2 }
# => { "foo" => 1, "bar" => 2 }
于 2015-12-07T05:13:17.807 に答える