Rust匹配表达式类型是否不确定?

Geo*_*rge 2 rust

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

let f = File::open("hello.txt");

let mut f = match f {
    Ok(file) => file,
    Err(e) => return Err(e)
};
Run Code Online (Sandbox Code Playgroud)

这似乎f可以具有type Result<_, _>(if f == Err(e))的值或类型的值_(即,无论何种类型file).

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

yat*_*ade 5

不,类型不是不确定的.您首先要创建一个类型的绑定Result<io::File, io::Error>.然后,您正在为f类型创建一个新的(可变的)绑定io::File(因为这是您的案例中枚举Ok变体中包含的内容Result)这个新绑定会影响旧的绑定,就像一个块,比如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
Run Code Online (Sandbox Code Playgroud)

在Rust中,let可以被认为是同样引入一个新的范围,遮蔽了以前的绑定.

既然你也return 出你的功能,当你遇到一个Err(_),编译器仍然能够推断出第二绑定类型fio::File.