Есть ли синтаксический сахар для сопоставления в глубоко вложенных цепочках Option и Result? - PullRequest
0 голосов
/ 14 ноября 2018

Я выполняю вызовы, которые возвращают Option, который содержит Result, который содержит еще один Option, который содержит пользовательские варианты.
Меня интересует только определенная цепочка вариантов вариантов, подобная этой:

if let Some(Ok(Some(CustomVariant(Some(value))))) = expr {
    // handle value case
}

Это становится довольно многословным и не очень полезным, так как я на самом деле отношусь к нему как к единому Result во всем моем коде.Могу ли я как-то использовать псевдоним этого кода, чтобы вместо записи всей цепочки Option s и Result s я мог сделать что-то похожее на:

alias TheCase(value) = Some(Ok(Some(CustomVariant(Some(value))));
if let TheCase(value) = expr {
    //handle value
}

1 Ответ

0 голосов
/ 14 ноября 2018

Вам не нужен такой псевдоним, просто используйте функцию, чтобы получить тот случай, который вам нужен:

fn oneCaseICareAbout(value: &Option<Result<Option<Foo>, Bar>>) -> Option<&Foo> {
    if let Some(Ok(Some(CustomVariant(Some(value)))) = value {
        Some(value)
    } else {
        None
    }
}

if let Some(value) = oneCaseICareAbout(expr) {
    //handle value
}

Однако я хотел бы рассмотреть возможность рефакторинга вашего кода, чтобы не использовать такой тип. Option<Result<_, _>> уже красный флаг, но Some(Ok(Some(CustomVariant(Some(…)))) только на грани безумия!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...