阅读 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
的类型。