Работа с
Result в
Rust часто приводит к «лесенке» из вложенных
match, но есть более элегантный способ: метод
.and_then(), который превращает громоздкие проверки в плоскую цепочку операций.
and_then - это комбинатор, который применяет функцию к значению внутри
Result, если оно
Ok, и возвращает новый
Result. Цепочка прерывается при первой ошибке.
Пример без использования and_then:
let result = match get_user() {
Ok(user) => match validate(&user) {
Ok(valid) => process(valid),
Err(e) => Err(e),
},
Err(e) => Err(e),
};
Более лаконичный пример с использованием and_then:
let result = get_user()
.and_then(|user| validate(&user))
.and_then(process);
Недостатки and_then:
- Сложно отлаживать: нельзя поставить точку останова между звеньями цепочки.
- Ограниченная гибкость: сложно вставить побочное действие (например логирование) между операциями.
- Непонятные ошибки: когда цепочка падает, не сразу ясно, на каком именно шаге.
- Только для чистых операций: не подходит для функций с побочными эффектами (запись в БД, логирование, изменение состояния).
Когда стоит избегать and_then:
- Сложная логика с разными типами ошибок.
- Длинные цепочки (более 4 операций).
- Необходимость побочных эффектов между шагами.
- Требуется подробное логирование каждого этапа.
Вывод:
and_then - это мощный инструмент для простых цепочек преобразований, но не панацея. Используйте его для коротких, чистых операций, где важна читаемость. Для сложных сценариев с побочными эффектами или подробной обработкой ошибок предпочтительнее явные
match или комбинация с
?.