2

次の配列があります

["key", "key_deeper", "key_even_deeper"]

そしてハッシュ:

{ "key" => { "key_deeper" => { "key_even_deeper" => "BINGO!" } } }

配列をハッシュに適用して受信する最短または最も表現力のある方法は何"BINGO!"ですか?


String => Hashこれは基本的なケースですが、キーの値が だけでなく である特殊なケースもありString => [Integer, Hash]ます。

例えば

["key1", "key2"]

ハッシュ上

{"key1" => [5, {"key2" => "BINGO!" }] }

を再び返す必要"BINGO!"がありますが、 のみを含む配列["key1"]は単純に を返し5ます。

4

2 に答える 2

6

おそらく最も簡単な方法は、次を使用することinjectです。

array.inject(hash) do |h, i|
  h.fetch(i){ {} }
end

# => "BINGO!"

これは、ルックアップ値の 1 つがハッシュに存在しない場合fetchを防ぐために使用されます。NoMethodErrorただし、その場合、空のハッシュが返されます。代わりに、標準のルックアップを実行したい場合があります。

array.inject(hash) {|h,i| h[i] }

編集:

これを行うためのさらに短い方法を次に示します (「より表現力豊か」と言えるかどうかはわかりませんが、より短い方法です)。

array.inject(hash, :[])
于 2013-03-31T00:42:09.043 に答える