すべての回答は、開始配列が一意であることを前提としています。OPは重複したエントリを持つ配列の処理方法を指定しなかったため、重複したキーになります。
を見ようよ:
a = ["item 1", "item 2", "item 3", "item 4", "item 1", "item 5"]
item 1 => item 2上書きされるため、ペアは失われますitem 1 => item 5。
Hash[*a]
=> {"item 1"=>"item 5", "item 3"=>"item 4"}
を含むすべてのメソッド reduce(&:merge!)同じ削除の結果。
しかし、これはまさにあなたが期待していることかもしれません。しかし、他の場合では、Array代わりにfor値を使用して結果を取得したい場合があります。
{"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
単純な方法は、ヘルパー変数、デフォルト値を持つハッシュを作成し、それをループで埋めることです。
result = Hash.new {|hash, k| hash[k] = [] } # Hash.new with block defines unique defaults.
a.each_slice(2) {|k,v| result[k] << v }
a
=> {"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
上記を1行で使用assocしreduceて実行することは可能ですが、それを推論して読むのははるかに難しくなります。
*呼び出されたスプラットの演算子。これは配列を取り、それを項目のリテラルリストに変換します。つまり*[1,2,3,4]=>1, 2, 3, 4です。この例では、上記はを実行することと同じHash["item 1", "item 2", "item 3", "item 4"]です。そしてHash持っている[](でも、インデックスキーと奇数のインデックス値を作る)引数のリストを受け取るメソッドを、しかし、Hash[]我々が使用してアレイをスプラットので、配列を受け付けません*。