Сопоставление шаблонов в Ruby с хэшами

Когда я изучал сопоставление шаблонов в 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.

Как это произошло? Для второго условия хеш должен содержать только имя и возраст, но в предоставленном хеше есть имя, возраст и местоположение.

первый не соответствует, вероятно, из-за типа строки, второй соответствует, потому что присутствуют имя и возраст, не обязательно наличие только 2 значений ключа

Anton Bogdanov 01.06.2024 12:54
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаблоны хеша по умолчанию игнорируют дополнительные ключи в совпадающем значении, за исключением пустого шаблона хеша, который соответствует только пустому хешу.

Если вы хотите точно сопоставить непустой хеш, вы можете добавить **nil к шаблону:

Изменять:

in {name: x, age: y}

к:

in {name: x, age: y, **nil}

и ваш код напечатает «Неверный шаблон».

Это задокументировано здесь.

Другие вопросы по теме