隐式和显式案例分析之间的主要区别是什么?

时间:2016-10-31 14:04:46

标签: rust

在阅读chapter on error handling in the book时,我想知道经常提到的“明确案例分析”的反面是什么。我知道并理解此代码示例使用明确的案例分析:

fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    match *self {
        CliError::Io(ref err) => write!(f, "IO error: {}", err),
        CliError::Parse(ref err) => write!(f, "Parse error: {}", err),
    }
}

但隐含的案例分析是什么?

1 个答案:

答案 0 :(得分:4)

在本书中,案例分析表示通过直接分析enum的每个案例来执行计算,例如使用matchif let表达式。本书给出的一个极端例子是

fn file_path_ext_explicit(file_path: &str) -> Option<&str> {
    match file_name(file_path) {    // <-- case analysis
        None => None,
        Some(name) => match extension(name) {   // <-- another case analysis
            None => None,
            Some(ext) => Some(ext),
        }
    }
}

明确的案例分析只是意味着明确使用“案例分析”。

没有“隐含案例分析”。本书建议将抽象常用的案例分析模式抽象为可组合的方法或宏,也许这就是你所想的。

例如,我们可以在match上的and_then方法中隐藏案例分析(Option<T>表达式):

fn and_then<F, T, A>(option: Option<T>, f: F) -> Option<A>
        where F: FnOnce(T) -> Option<A> {
    match option {   // <-- case analysis moved into here
        None => None,
        Some(value) => f(value),
    }
}

然后可以将file_path_ext_explicit函数简化为

fn file_path_ext(file_path: &str) -> Option<&str> {
    // no `match` expressions
    file_name(file_path).and_then(extension)
}

表示函数的意图更清晰,更不容易出现逻辑错误。