値が既知の配列にあるハッシュをパターン マッチングするにはどうすればよいですか?
概要
ハッシュのパターンマッチを試みています。ハッシュに、文字列値が既知の文字列の配列内にあるキーが含まれているかどうかを知りたいです(機能している他の基準とともに)。
私がこれまでに持っているものは次のとおりです。
THINGS = %w[red orange yellow]
hash = {foo: 'yellow'}
case hash
in {foo: THINGS}
# I want this to match but it doesn't
else
# ..
end
パターンマッチングでこれは可能でしょうか?
解決策
パターンマッチングと@Rajagopalanの提案を組み合わせて使用できますか?ガード句を使用することによって。
THINGS = %w[red orange yellow]
def foo_color_match(hash)
case hash
in foo: a if THINGS.any?(a)
"matched #{a}"
else
'no_match'
end
end
h = {foo: 'yellow'}
h1 = {foo: 'black'}
p foo_color_match(h)
#=> "matched yellow"
p foo_color_match(h1)
#=> "no match"
それ以外の場合は、次のような奇妙なトリックを実行できます
THINGS = %w[red orange yellow]
def foo_color_match(hash, color_palette: THINGS)
m = color_palette.to_enum
def m.===(other) = member?(other)
case hash
in foo: ^m => a
"matched #{a}"
else
'no_match'
end
end
h = {foo: 'yellow'}
h1 = {foo: 'black'}
p foo_color_match(h)
#=> "matched yellow"
p foo_color_match(h1)
#=> "no match"