Rust 初始化期间类型的歧义

Rust 初始化期间类型的歧义,rust,Rust,我遇到了一个有趣的情况,Rust无法在初始化过程中正确推断值的类型,即使它被指定。让我们从例子开始: 这没关系: let level: log::LogLevelFilter = { let mut level = log::LogLevelFilter::Debug; if env::var("TRACE_ENABLED").is_ok() { level = log::LogLevelFilter::Trace; } level }; 这不是

我遇到了一个有趣的情况,Rust无法在初始化过程中正确推断值的类型,即使它被指定。让我们从例子开始:

这没关系:

let level: log::LogLevelFilter = {
    let mut level = log::LogLevelFilter::Debug;
    if env::var("TRACE_ENABLED").is_ok() {
        level = log::LogLevelFilter::Trace;
    }
    level
};
这不是:

let level: log::LogLevelFilter = {
    if env::var("TRACE_ENABLED").is_ok() {
        return log::LogLevelFilter::Trace
    }
    log::LogLevelFilter::Debug
};
错误文本:

src/main.rs:26:20: 26:46 error: mismatched types:
 expected `()`,
    found `log::LogLevelFilter`
(expected (),
    found enum `log::LogLevelFilter`) [E0308]
src/main.rs:26             return log::LogLevelFilter::Trace
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:26:20: 26:46 help: run `rustc --explain E0308` to see a detailed explanation
这里怎么了?我想我以前写过这样的代码,没有任何问题

.

此处的返回值试图从您不在大括号块中的函数中返回该值,该函数需要类型为的返回值,这就是错误消息所说的

写这篇文章的一种更为惯用的方式是:

let level: log::LogLevelFilter = if env::var("TRACE_ENABLED").is_ok() {
    log::LogLevelFilter::Trace
} else {
    log::LogLevelFilter::Debug
};
您甚至可能不需要level:log::LogLevelFilter类型注释。

这里的返回值试图从函数返回您不在花括号块中的值,该函数需要类型为的返回值,这就是错误消息所说的

写这篇文章的一种更为惯用的方式是:

let level: log::LogLevelFilter = if env::var("TRACE_ENABLED").is_ok() {
    log::LogLevelFilter::Trace
} else {
    log::LogLevelFilter::Debug
};

您甚至可能不需要level:log::LogLevelFilter类型注释。

return log::LogLevelFilter::Trace表示从当前函数返回。因此函数的返回类型必须匹配。return log::LogLevelFilter::Trace表示从当前函数返回。因此函数的返回类型必须匹配。甚至可能最终启用let level=env::varTRACE_。确定。map_或LogLevelFilter::Debug,| | LogLevelFilter::Trace;我认为外部块是不必要的,已经足够了。@Shepmaster在我看来有点神秘,但这是一个有效的较短的解决方案:@Kroltan你说得对,谢谢!我已经更新了我的代码。甚至可能最终启用了let level=env::varTRACE_。好的。map_或LogLevelFilter::Debug,| | LogLevelFilter::Trace;我认为外部块是不必要的,已经足够了。@Shepmaster在我看来有点神秘,但这是一个有效的较短的解决方案:@Kroltan你说得对,谢谢!我已经更新了我的代码。