Pattern Matching
От: x-code  
Дата: 28.12.20 17:31
Оценка:
Провожу сравнительный анализ паттерн матчинга в таких языках как Rust, Scala и Swift. И вот что получается.
1. По сравнению с классическим switch иp С/С++ аргументом оператора может быть любой объект любого типа, а не только целое число.
Это вполне логичная унифкация, но это лишь расширение switch и не делает сопоставление с образцом чем-то особенным.
2. Возможны дополнительные условия в операторе when, который интегрирован с оператором switch/match в том смысле, что если условие when ложно, то поиск образца будет продолжен
3. Образцами, кроме полноценных объектов, могут быть и "частичные" (если можно так сказать) объекты, т.е. составные объекты, у которых заданы не все поля. Те поля, которые не важны для сравнения, отмечаются допустим символом подчеркивания _
4. Вместо подчеркивания можно прямо в образце объявлять переменные, которые принимают значение соответствующих полей аргумента при совпадении образца с аргументом.
Синтаксис может отличаться, вот в Swift это наиболее явно и наглядно
let personInfo = ("Tom", 22)
switch personInfo {
case (let name, 22):
    print("Имя: \(name) и возраст: 22")
case ("Tom", let age):
    print("Имя: Tom и возраст: \(age)")
case let (name, age):
    print("Имя: \(name) и возраст: \(age)")
}

В Rust и Scala новые имена берутся "с потолка" (без var или let) и потому для меня это менее наглядно.

В некотором смысле, можно сказать, что в образце часть полей "для чтения" (по ним осуществляется сравнение), а другая часть — "для записи" (в них записываются поля из аргумента в случае совпадения образца с аргументом).

И вот тут вопрос: а что дают такие переменные? Ведь все данные уже есть в аргументе оператора switch или match. Просто удобство? Или есть какие-то случаи, когда такие аргументы дают нечто качественно другое, чего нельзя получить обращением к полям аргумента?
Отредактировано 28.12.2020 17:32 x-code . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.