首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内隐分析和显性案例分析的主要区别是什么?

内隐分析和显性案例分析的主要区别是什么?
EN

Stack Overflow用户
提问于 2016-10-31 14:04:46
回答 1查看 187关注 0票数 1

在阅读书中关于错误处理的章节时,我想知道通常提到的“显式案例分析”的反面是什么。我知道并理解这个代码示例使用显式的案例分析:

代码语言:javascript
运行
复制
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),
    }
}

但什么是隐式案例分析?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-31 14:43:25

在本书中,case analysis意味着通过直接分析enum的每一种情况来执行计算,例如使用matchif let表达式。书中给出的一个极端例子是

代码语言:javascript
运行
复制
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表达式)隐藏在Option<T>上的and_then方法中。

代码语言:javascript
运行
复制
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函数简化为

代码语言:javascript
运行
复制
fn file_path_ext(file_path: &str) -> Option<&str> {
    // no `match` expressions
    file_name(file_path).and_then(extension)
}

它更清楚地表达了该功能的意图,并且不太容易出现逻辑错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40343801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档