Когда я изучал сопоставление шаблонов в Ruby, я столкнулся с этой проблемой.
hash = { name: 1, age: 21, location: "NYC" }
case hash
in {name: String => x, age:y, location:z}
puts "Name: #{x}, Age: #{y}, Location: #{z}"
in {name: x, age:y}
puts "Name: #{x}, Age: #{y}"
else
puts "Invalid pattern"
end
В приведенном выше коде я ожидал, что на экране будет напечатан неверный шаблон (поскольку значение ключевого слова имени является целым числом), но когда я запустил повтор, на консоли было напечатано значение: Имя: 1, Возраст: 21.
Как это произошло? Для второго условия хеш должен содержать только имя и возраст, но в предоставленном хеше есть имя, возраст и местоположение.

Шаблоны хеша по умолчанию игнорируют дополнительные ключи в совпадающем значении, за исключением пустого шаблона хеша, который соответствует только пустому хешу.
Если вы хотите точно сопоставить непустой хеш, вы можете добавить **nil к шаблону:
Изменять:
in {name: x, age: y}
к:
in {name: x, age: y, **nil}
и ваш код напечатает «Неверный шаблон».
Это задокументировано здесь.
первый не соответствует, вероятно, из-за типа строки, второй соответствует, потому что присутствуют имя и возраст, не обязательно наличие только 2 значений ключа