首页 > 解决方案 > 如何从 if 语句中的函数中获取值

问题描述

如果用户提供一些信息,我会尽量避免运行函数。

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_serverapp.is_present存在时运行。为什么在 if 语句中分配“最佳”以以下错误结尾:

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

标签: rust

解决方案


当您使用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 语句分支中表达式末尾缺少 a ;。如果那里有分号,则不会分配表达式的值。


推荐阅读