初始化期间类型的歧义

时间:2016-06-15 06:47:44

标签: 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
};

这不是:

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

这里有什么问题?我想我以前写过这样的代码没有任何问题。

Shorter example with similar problem

1 个答案:

答案 0 :(得分:6)

return这里试图从你所在的函数(而不是大括号块)中返回该值,并且该函数需要返回类型()的值,这是什么错误信息说。

更为惯用的方式是:

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

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