Techioz Blog

値が既知の配列にあるハッシュをパターン マッチングするにはどうすればよいですか?

概要

ハッシュのパターンマッチを試みています。ハッシュに、文字列値が既知の文字列の配列内にあるキーが含まれているかどうかを知りたいです(機能している他の基準とともに)。

私がこれまでに持っているものは次のとおりです。

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"