如果用户提供了一些信息,我会尽量避免运行函数。
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);
}
我希望代码只在app.is_present
存在的情况下才运行best_server
。为什么在if语句中赋值"best“会以下面的错误结束:
--> src/main.rs:80:35
|
80 | let dl = server::download(best.id.as_str(), bytes).unwrap();
| ^^^^ not found in this scope
发布于 2019-05-10 09:28:40
使用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语句分支中的表达式末尾缺少;
。如果那里有分号,那么表达式的值就不会被赋值。
https://stackoverflow.com/questions/56065089
复制相似问题