锈匹配表达式类型不确定



阅读 Rust 教程时,我发现了以下代码片段:

let f = File::open("hello.txt");
let mut f = match f {
    Ok(file) => file,
    Err(e) => return Err(e)
};

这似乎f可以具有类型 Result<_, _> 的值(如果f == Err(e))或类型 _ 的值(即,file碰巧是什么类型)。

那么这是否意味着 Rust 中的匹配表达式是类型不确定的?

不,类型不是不确定的。首先创建类型 Result<io::File, io::Error> 的绑定。然后,您正在为 io::File 类型的f创建一个新的(可变)绑定(因为这是您的情况下 Result 枚举的Ok变体中包含的内容)这个新的绑定隐藏了旧的绑定,就像一个块一样,比如说,Perl(和 C/C++ 等)会引入一个新的作用域:

my $x = [42, 24];
{
    # new scope
    my $x = $x->[0];
    say Dumper $x; # 42, an INT
}
say Dumper $x; # [42, 24], an ARRAY

在 Rust 中,let可以被认为是类似地引入一个新的作用域,掩盖了以前的绑定。

由于在遇到Err(_)时也会return函数,因此编译器仍然能够推断出要io::File的第二个绑定f的类型。

相关内容

最新更新