*演算子がそのような配列で使用される場合、それはスプラット演算子と呼ばれます。
配列の周りの最初のレベルの角かっこを削除する演算子と考えてください。配列を引数リストに変換できるため、これは非常に便利です。
def stuff(x, y, z)
end
a = [1, 2, 3]
stuff(*a) # x,y,z gets assigned 1,2,3
同じことが。でも機能しHash[]ます。onの[]演算子Hashは、引数として受け入れます。
- キーと値のペアの引数リスト:
Hash["a", 1, "b", 2] #=> { "a" => 1, "b" => 2 }
- キー値を表す1つまたは複数の配列ペア:
Hash[ [["a", 1], ["b", 2]] ] #=> { "a" => 1, "b" => 2 }
Hash[]プレーンフラット配列を引数として受け入れません:
Hash[ ["a", 1, "b", 2] ] #=> {}
したがって、これを念頭に置いて、さらにスプラットオペレーターが何をしているのかを理解することで、何が起こっているのかを確認できます。
paired_array = a1.zip(a2)
=> [[1, "A"], [2, "B"], [3, "C"]]
plain_array = a1.zip(a2).flatten
=> [1, "A", 2, "B", 3, "C"]
# Per rule 2 above we know this works
Hash[paired_array]
=> {1=>"A", 2=>"B", 3=>"C"}
# This won't work
Hash[plain_array]
=> {}
# But if we turn the plain_array into an argument list,
# then we know per rule 1 above that this will work
Hash[*plain_array]
=> {1=>"A", 2=>"B", 3=>"C"}
さて、あなたはあなたがそうするときにちょっと何が起こっているのか疑問に思うかもしれません:
a = *plain_array
=> [1, "A", 2, "B", 3, "C"]
スプラット演算子がブラケットを効果的に削除することがわかっているので、次のようになります。
a = 1, "A", 2, "B", 3, "C"
...おかしなことに、これは有効なRubyコードであり、配列を再度作成するだけです。
splat演算子のrubyspecテストケースで、splat演算子に関するもっと楽しいものを読むことができます。