Ruby 3 でハッシュ値のパターン マッチを実行してハッシュ キーを取得することは可能ですか?
概要
Ruby3のパターンマッチングについての質問です。
ハッシュがあります:
h = {
x: [1, 2, 3],
y: [11, 12, 13],
z: [100, 101],
}
整数 (たとえば、13) が与えられた場合、ハッシュ値にその整数 (この例では :y) が含まれるハッシュ キーを見つけたいと思います。
もちろん、パターン マッチングを使用せずに Ruby でこれを行う方法はあります。
ここでは、これを達成するためにハッシュに対して Ruby 3 のパターン マッチングを使用することだけに興味があります。通常、Ruby のパターン マッチングは、値ではなく、ハッシュのキーに基づいて一致します。また、このハッシュには多くのキーが含まれており、キーの名前は事前にわかりません。
私が見つけた最も近い方法は、最初にハッシュを配列に変換し、その配列でパターン マッチングを使用することです。
def find_the_key(a_hash, a_number)
case a_hash.to_a
in [*, [the_key, [*, ^a_number, *]], *]
the_key
else
:key_not_found
end
end
puts find_the_key(h, 13) => :y
puts find_the_key(h, 999) => :key_not_found
ハッシュ自体のパターンマッチングを使用することで、つまり最初に配列に変換せずに、これを機能させる方法はありますか?
この問題を解決するためにパターン マッチングを適用する他の方法はありますか?
ありがとう
解決策
これが私が思いつく限り最も近いものです。まず、パターンの一致を a_hash.values に制限し (とにかく一致するのはこれだけです)、 =>the_value を使用して一致の必要な部分を変数に割り当て、次に a_hash.key( を使用してキーを見つけます)値):
h = {
x: [1, 2, 3],
y: [11, 12, 13],
z: [100, 101],
}
def find_the_key(a_hash, a_number)
case a_hash.values
in [*, [*, ^a_number, *]=>the_value, *]
the_key = a_hash.key(the_value)
else
:key_not_found
end
end
puts find_the_key(h, 13) #=> y
puts find_the_key(h, 77) #=> key_not_found