阅读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中的匹配表达式是不确定的类型?
不,类型不是不确定的.您首先要创建一个类型的绑定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(_),编译器仍然能够推断出第二绑定类型f是io::File.