2016-06-15 4 views
1

Я столкнулся с интересной ситуацией, когда 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.

+2

'return log :: LogLevelFilter :: Trace' означает, что вы возвращаетесь от текущей функции. Поэтому возвращаемый тип функции должен совпадать. – WiSaGaN

ответ

6

Здесь return пытается вернуть это значение из функции, в которой вы находитесь (а не фигурного блока фигурных скобок), и эта функция ожидает возвращаемого значения типа (), о чем говорится в сообщении об ошибке.

Более идиоматический способ писать это будет:

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

, и вы, скорее всего, даже не нуждаетесь в level: log::LogLevelFilter аннотации типа.

+2

Может даже закончиться с 'let level = env :: var (" TRACE_ENABLED "). Ok(). Map_or (LogLevelFilter :: Debug, | _ | LogLevelFilter :: Trace);' – Shepmaster

+0

Я думаю, что внешний блок не необходимо, ['let level = if env :: var (" TRACE_ENABLED "). is_ok() {log :: LogLevelFilter :: Trace} else {log :: LogLevelFilter :: Debug};'] (https: // play. rust-lang.org/?code=enum%20LogLevel%20%7B%0A%20%20%20%20Trace%2C%0A%20%20%20%20Debug%0A%7D%0A%0Afn%20main() % 20% 7B% 0A% 20% 20% 20% 20let% 20cond% 20% 3D% 20true% 3B% 0A% 20% 20% 20% 20let% 20level% 20% 3D% 20if% 20cond% 20% 7B% 0A % 20% 20% 20% 20% 20% 20% 20% 20LogLevel% 3A% 3ATrace% 0A% 20% 20% 20% 20% 7D% 20else% 20% 7B% 0A% 20% 20% 20% 20% 20 % 20% 20% 20LogLevel% 3A% 3ADebug% 0A% 20% 20% 20% 20% 7D% 3B% 0A% 7D & version = stable & backtrace = 0). – Kroltan

+1

@Shepmaster, который выглядит слишком загадочным, на мой взгляд, но это действующее более короткое решение :) – Dogbert

Смежные вопросы