-1

値が size の配列であるハッシュがあります1

hash = {:start => [1]}

次のように配列を解凍したい:

hash.each_pair{ |key, value| hash[key] = value[0] } # => {:start=>1}

次のような -operator が機能すると思いました*が、期待どおりの結果が得られません。

hash.each_pair{ |key, value| hash[key] = *value } # => {:start=>[1]}

*valueが返されて返さ[1]れないのはなぜ1ですか?

4

3 に答える 3

4

[]=に適用されるメソッドhashは、キー (パーツ内に配置される) に加えて 1 つの引数のみ[]と、一般に値のシーケンスである分割/展開された配列 (偶然にも、この特定の単一の要素である)を取るためです。 case) はそのまま引数として受け入れることはできません。[]=ということで、やっぱり配列としての引数で受理されます。

つまり、([]=メソッドの) 引数はオブジェクトでなければなりませんが、分割された要素 ( など:foo, :bar, :baz) はオブジェクトではありません。それらをオブジェクトとして解釈する唯一の方法は、それらを配列 ( など[:foo, :bar, :baz]) に戻すことです。

splat 演算子を使用すると、次のように実行できます。

hash.each_pair{|key, value| hash.[]= key, *value}
于 2015-09-15T11:15:41.163 に答える