我遇到过一个有趣的情况,即使指定了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
这里有什么问题?我想我以前写过这样的代码没有任何问题。
答案 0 :(得分:6)
return
这里试图从你所在的函数(而不是大括号块)中返回该值,并且该函数需要返回类型()
的值,这是什么错误信息说。
更为惯用的方式是:
let level: log::LogLevelFilter = if env::var("TRACE_ENABLED").is_ok() {
log::LogLevelFilter::Trace
} else {
log::LogLevelFilter::Debug
};
并且您很可能甚至不需要level: log::LogLevelFilter
类型注释。