如何访问`if let`表达式之外的变量?

use*_*985 1 rust

我正在尝试访问命令行参数.如果论证存在,做一些事情,如果没有,什么都不做.我有这个代码:

fn main() {
    if let Some(a) = std::env::args().nth(2) {
        let b = a;
    }

    println!("{}", a);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法访问此范围之外的var a或b.我该如何解决这个问题?

或者,有没有更好的方法来接近我正在尝试做的事情?

She*_*ter 6

在Rust中,问自己"这个变量的类型是什么?"总是有用的.让我们用你的例子运行并假装它有效:

let arg = Some(true);

if let Some(a) = arg {
    let b = a;
}

println!("{:?}", b);
Run Code Online (Sandbox Code Playgroud)

是什么类型bprintln线?也许你希望它是一个布尔值,但如果该if子句没有通过,它的类型是什么?没有一个!在其他语言,也许这将是nilnull,但锈编码与该信息Option类型-这就是SomeNone来自!

此外,范围在Rust 中非常有意义.范围内定义的项目不会泄漏到该范围之外:

{
    let a = 4;
}

println!("{}", a); // NOPE!
Run Code Online (Sandbox Code Playgroud)

在这两个部分之间,您想要编写的代码是不可能的.我同意正确的解决方案是将println嵌入if:

let arg = Some(true);

if let Some(a) = arg {
    println!("{:?}", a);
}
Run Code Online (Sandbox Code Playgroud)


oli*_*obk 5

要了解正在发生的事情,请查看Shepmaster的答案

我不确定在不满足条件的情况下您期望发生什么。如果您只想在这种情况下中止程序,则惯用的Rust方法是使用unwrapexpect

// panics if there are fewer than 3 arguments.
let a = env::args().nth(2).unwrap();

println!("{}", a);
Run Code Online (Sandbox Code Playgroud)

如果需要默认值以防自变量不存在,则可以使用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);
Run Code Online (Sandbox Code Playgroud)

作为另一种选择,您可以使用在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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)