Some()在变量赋值的左侧做了什么?

Qwe*_*tie 0 syntax pattern-matching rust

我正在阅读一些Rust代码,我遇到了这一行

if let Some(path) = env::args().nth(1) {
Run Code Online (Sandbox Code Playgroud)

在这个功能里面

fn main() {
    if let Some(path) = env::args().nth(1) {
        // Try reading the file provided by the path.
        let mut file = File::open(path).expect("Failed reading file.");
        let mut content = String::new();
        file.read_to_string(&mut content);

        perform_conversion(content.as_str()).expect("Conversion failed.");
    } else {
        println!(
            "provide a path to a .cue file to be converted into a MusicBrainz compatible tracklist."
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

该行似乎是将env参数分配给变量路径,但我无法弄清楚Some()它周围正在做什么.

我看了一下文档Option,我理解它在右侧使用时是如何工作的=但是在左侧我有点困惑.

我是否认为这条线相当于

if let path = Some(env::args().nth(1)) {
Run Code Online (Sandbox Code Playgroud)

Öme*_*den 5

来自参考:

if表达式在语义上类似于if表达式,但是代替条件表达式,它期望关键字let后面跟一个可反射模式,一个=和一个表达式.如果=右侧的表达式的值与模式匹配,则相应的块将执行,否则流程将继续到下一个其他块(如果存在).与if表达式一样,如果let表达式具有由计算的块确定的值.

在这里,重要的部分是可反复性.这里的可改变模式是什么意思,它可以是不同的形式.例如 :

enum Test {
    First(String, i32, usize),
    Second(i32, usize),
    Third(i32),
}
Run Code Online (Sandbox Code Playgroud)

您可以检查x的值,以获得3种不同模式的值,例如:

fn main() {
    let x = Test::Second(14, 55);
    if let Test::First(a, b, c) = x {}
    if let Test::Second(a, b) = x {} //This block will be executed
    if let Test::Third(a) = x {}
}
Run Code Online (Sandbox Code Playgroud)

这称为可反复性.但请考虑您的代码:

enum Test {
    Second(i32, usize),
}

fn main() {
    let x = Test::Second(14, 55);
    if let Test::Second(a, b) = x {}
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为x的模式很明显,它有单一模式.您可以从可引用性参考中获得更多信息.

你也没想到这个:

if let path = Some(env::args().nth(1)) {
Run Code Online (Sandbox Code Playgroud)

编译器会抛出像irrefutable if-let模式这样的错误,因为正如引用所说的那样:"关键字让后面跟一个可反射的模式".在这里,"let"之后没有可反复的模式.实际上这段代码试图创建一个名为path的变量,这是一个Option,这没有任何意义,因为不需要" If ",

相反,Rust希望你这样写:

let path = Some(env::args().nth(1)); // This will be seem like Some(Some(value))
Run Code Online (Sandbox Code Playgroud)