0

arrが配列であると仮定し[[1,3],[2,5],[3,8]]ます。どういう*意味だろうと思いました。どういう意味ですか?

hash = Hash[*arr.flatten] # => {1=>3, 2=>5, 3=>8}

私は次のことを試しました

arr.flatten # => [1, 3, 2, 5, 3, 8]
Hash[arr.flatten] # => {}
Hash[*a.flatten] # => {1=>3, 2=>5, 3=>8}
4

2 に答える 2

1

ここに説明があります

そうすると、すべての内部配列がスラットされた1 つの平坦化配列array.flattenが得られます。ここで、この平坦化された配列をメソッド内に配置しています。ただし、以下の構成をサポートしています:Hash::[]Hash::[]

Hash[ key, value, ... ] → new_hash 
# or
Hash[ [ [key, value], ... ] ] → new_hash

今すぐarray.flattenあなたを与えます[1, 3, 2, 5, 3, 8]Hash[]これで、この配列を のように入れていますHash[[1, 3, 2, 5, 3, 8]]。上記の 2 つの構造と比較してみましょう。どちらかが一致しますか? いいえ。したがって、内側の配列を再度スプラットする必要があるため、内側の配列をスプラットするには (splatted operator) が必要*です。

これHash[*[1, 3, 2, 5, 3, 8]]で、 が得られHash[1, 3, 2, 5, 3, 8]ます。ここで、上記の 2 つの構成を再度確認します。2 のどちらとも一致しますか? 今回は、最初のもの。これで、目的の hash が得られました{1=>3, 2=>5, 3=>8}

ところで、配列Hash::[]を直接内部に配置すると、2番目のコンストラクトが正確に一致するため、スプラットする必要はありません。

array = [[1,3],[2,5],[3,8]]
Hash[array] # => {1=>3, 2=>5, 3=>8}

上記は、ドキュメントが示唆する2番目の構造Hash[array]を意味するためHash[[[1,3],[2,5],[3,8]]]、機能しました。

いくつかの例を読んで、Ruby でスプラッティングがどのように機能するかを確認してください。

別の構造があります:-

 Hash[ object ] → new_hash

これは、なぜ{}. Hash[[1, 3, 2, 5, 3, 8]]ドキュメントによると、最後のタイプのコンストラクトと同じです。ドキュメントは言っています -

2 番目と 3 番目の形式は、キーと値のペアの配列またはハッシュに変換可能なオブジェクトのいずれかである単一の引数を取ります。

そう。[1,3,2,5,3,8]変換できないArrayオブジェクトです。現在、オブジェクトが 3 番目のコンストラクトの場合、空の hashが返されます。ただし、リリースの将来のバージョンではエラーがスローされます。以下の警告を参照してください。Hash

[1] pry(main)> Hash[[1,2]]
(pry):1: warning: wrong element type Fixnum at 0 (expected array)
(pry):1: warning: ignoring wrong elements is deprecated, remove them explicitly
(pry):1: warning: this causes ArgumentError in the next release
(pry):1: warning: wrong element type Fixnum at 1 (expected array)
(pry):1: warning: ignoring wrong elements is deprecated, remove them explicitly
(pry):1: warning: this causes ArgumentError in the next release
=> {}

私のRubyバージョンは次のとおりです。

ruby 2.0.0p451 (2014-02-24 revision 45167) [i686-linux]
于 2014-06-20T17:06:04.460 に答える
0

Hash クラスに引数を渡すときは、括弧で囲むことができます...

Hash(arr.flatten)

またはなしで...

Hash arr.flatten

いずれの場合も、Hash は引数を取り、要素数が偶数の配列の場合は、奇数要素がキーで偶数要素が値であるハッシュを作成します。

ハッシュは角括弧を使用して同様の操作を実行することもできます

Hash[1, 2]
=> {1=>2}

しかし、これを行うと...

Hash[arr.flatten]

配列内で配列を渡しているため、予期しない結果が得られます。

これをすると...

Hash[*arr.flatten] 

arr.flatten配列を取得して、配列としてではなく、メソッドへの個別の個別の引数として渡すと言っています。

したがって、Hash[arr.flatten]実際にはHash[[1, 3, 2, 5, 3, 8]](配列である 1 つの要素を含む配列)Hash[*arr.flatten]は実際にはHash[1, 3, 2, 5, 3, 8](6 つの要素を含む配列)です。

興味深いことに、[] メソッドは、キーと値のペアの配列を含む配列を取ることができます。

Hash[arr]

正常に動作します!平らにしたり、はねたりする必要はありません。

于 2014-06-20T17:38:05.637 に答える