如何从if语句中的函数获取值

时间:2019-05-09 17:57:43

标签: rust

如果用户提供一些信息,我试图避免运行某个功能。

if let Some(app) = app.subcommand_matches("Download") {
    if app.is_present("Server") {
        let best = app.value_of("Server").unwrap();
    } else {
        let best = server::best_server("3").unwrap().to_owned();
        let best = best.id.as_str();
    };
    let bytes = app.value_of("bytes").unwrap_or("100000024");
    let dl = server::download(best, bytes).unwrap();
    println!("Download Results {:#?} mbps", dl);
}

如果存在best_server,我希望代码仅运行app.is_present。 为什么在if语句中分配“ best”会导致以下错误:

 --> src/main.rs:80:35
   |  
80 |         let dl = server::download(best.id.as_str(), bytes).unwrap();  
   |                                   ^^^^ not found in this scope  

1 个答案:

答案 0 :(得分:0)

使用let关键字时,您是在该语句出现的范围内声明给定变量。范围从封闭的大括号{开始,到封闭的大括号}结束。

所以这个:

if app.is_present("Server") {
    let best = app.value_of("Server").unwrap();
}

声明了一个变量best,但是该变量在右花括号后不存在。这就是为什么您收到的错误消息指出变量不存在。

解决此问题的一种方法是利用if语句具有值的事实:所选分支中最后一个表达式的值。所以你可以说:

let best = if app.is_present("Server") {
    app.value_of("Server").unwrap()
} else {
    server::best_server("3").unwrap().to_owned().id.as_str()
};

请注意,if语句内的表达式末尾缺少;。如果存在分号,则不会分配表达式的值。