如何访问 `if let` 表达式之外的变量?
How do I access a variable outside of an `if let` expression?
我正在尝试访问命令行参数。如果存在争论,就做点什么,如果不存在,就什么都不做。我有这个代码:
fn main() {
if let Some(a) = std::env::args().nth(2) {
let b = a;
}
println!("{}", a);
}
我无法访问此范围之外的 a
或 b
:
error[E0425]: cannot find value `a` in this scope
--> src/main.rs:6:20
|
6 | println!("{}", a);
| ^ not found in this scope
我该如何解决这个问题?有没有更好的方法来处理我正在尝试做的事情?
要了解发生了什么,请查看
我不确定在不满足条件的情况下您希望发生什么。如果你只是想在这种情况下中止程序,惯用的 Rust 方法是使用 unwrap
or expect
.
// panics if there are fewer than 3 arguments.
let a = env::args().nth(2).unwrap();
println!("{}", a);
如果你想要一个默认值以防参数不存在,你可以使用unwrap_or
.
// assigns "I like Rust" to a if there are fewer than 3 arguments
let a = env::args().nth(2).unwrap_or("I like Rust".to_string());
println!("{}", a);
作为另一种选择,您可以使用在 Rust 中几乎所有东西都是表达式的特性:
let b = if let Some(a) = env::args().nth(2) {
a
} else {
// compute alternative value
let val = "some value".to_string();
// do operations on val
val
};
println!("{}", b);
惯用的 Rust 编写方式是使用闭包和 unwrap_or_else
:
let b = env::args().nth(2).unwrap_or_else(|| {
// compute alternative value
let val = "some value".to_string();
// do operations on val
val
});
println!("{}", b);
在 Rust 中,问问自己总是有用的 "what is the type of this variable?"。让我们 运行 使用您的示例并假装它有效:
let arg = Some(true);
if let Some(a) = arg {
let b = a;
}
println!("{:?}", b);
println
行的 b
是什么类型?也许您希望它是一个布尔值,但是 如果 if
子句没有通过 ,那么类型是什么?一个都没有!在其他语言中,可能是 nil
或 null
,但 Rust 使用 Option
类型对该信息进行编码——这就是 Some
和 None
的来源!
此外,作用域在 Rust 中非常有意义。范围内定义的项目不会泄漏到该范围外:
{
let a = 4;
}
println!("{}", a); // NOPE!
在这两部分之间,你想写的代码是不可能的。我同意正确的解决方案是将 println 嵌入 if:
let arg = Some(true);
if let Some(a) = arg {
println!("{:?}", a);
}
我同意你要么在 if-else block
中做任何你想做的事。如果你只是不想缩进你的代码并且你的 else
块很小,你可以反转你的 if-condition
.
而不是
let arg = std::env::args().nth(2);
if let Some(a) = arg {
let b = a;
// do stuff
} else {
// do other stuff
}
你可以做到
let arg = std::env::args().nth(2);
if arg.is_none() {
// do other stuff
}
let b = arg.unwrap();
// do stuff
如果您希望变量在外部范围内可用,但在内部范围内为其赋值,则可以在外部声明它。
let arg = std::env::args().nth(2);
let a; // declared but not assigned
if let Some(b) = arg {
a = b; // wasn't mut but first assignment can be done here
} else {
a = "Foobar".to_string();
}
println!("{}", a); // available here but was assigned the value inside if
我正在尝试访问命令行参数。如果存在争论,就做点什么,如果不存在,就什么都不做。我有这个代码:
fn main() {
if let Some(a) = std::env::args().nth(2) {
let b = a;
}
println!("{}", a);
}
我无法访问此范围之外的 a
或 b
:
error[E0425]: cannot find value `a` in this scope
--> src/main.rs:6:20
|
6 | println!("{}", a);
| ^ not found in this scope
我该如何解决这个问题?有没有更好的方法来处理我正在尝试做的事情?
要了解发生了什么,请查看
我不确定在不满足条件的情况下您希望发生什么。如果你只是想在这种情况下中止程序,惯用的 Rust 方法是使用 unwrap
or expect
.
// panics if there are fewer than 3 arguments.
let a = env::args().nth(2).unwrap();
println!("{}", a);
如果你想要一个默认值以防参数不存在,你可以使用unwrap_or
.
// assigns "I like Rust" to a if there are fewer than 3 arguments
let a = env::args().nth(2).unwrap_or("I like Rust".to_string());
println!("{}", a);
作为另一种选择,您可以使用在 Rust 中几乎所有东西都是表达式的特性:
let b = if let Some(a) = env::args().nth(2) {
a
} else {
// compute alternative value
let val = "some value".to_string();
// do operations on val
val
};
println!("{}", b);
惯用的 Rust 编写方式是使用闭包和 unwrap_or_else
:
let b = env::args().nth(2).unwrap_or_else(|| {
// compute alternative value
let val = "some value".to_string();
// do operations on val
val
});
println!("{}", b);
在 Rust 中,问问自己总是有用的 "what is the type of this variable?"。让我们 运行 使用您的示例并假装它有效:
let arg = Some(true);
if let Some(a) = arg {
let b = a;
}
println!("{:?}", b);
println
行的 b
是什么类型?也许您希望它是一个布尔值,但是 如果 if
子句没有通过 ,那么类型是什么?一个都没有!在其他语言中,可能是 nil
或 null
,但 Rust 使用 Option
类型对该信息进行编码——这就是 Some
和 None
的来源!
此外,作用域在 Rust 中非常有意义。范围内定义的项目不会泄漏到该范围外:
{
let a = 4;
}
println!("{}", a); // NOPE!
在这两部分之间,你想写的代码是不可能的。我同意正确的解决方案是将 println 嵌入 if:
let arg = Some(true);
if let Some(a) = arg {
println!("{:?}", a);
}
我同意你要么在 if-else block
中做任何你想做的事。如果你只是不想缩进你的代码并且你的 else
块很小,你可以反转你的 if-condition
.
而不是
let arg = std::env::args().nth(2);
if let Some(a) = arg {
let b = a;
// do stuff
} else {
// do other stuff
}
你可以做到
let arg = std::env::args().nth(2);
if arg.is_none() {
// do other stuff
}
let b = arg.unwrap();
// do stuff
如果您希望变量在外部范围内可用,但在内部范围内为其赋值,则可以在外部声明它。
let arg = std::env::args().nth(2);
let a; // declared but not assigned
if let Some(b) = arg {
a = b; // wasn't mut but first assignment can be done here
} else {
a = "Foobar".to_string();
}
println!("{}", a); // available here but was assigned the value inside if