Techioz Blog

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