阅读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中的匹配表达式是不确定的类型?
答案 0 :(得分: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
在Rust中,let
可以被认为是同样引入新范围,遮蔽了之前的绑定。
由于遇到return
时,您Err(_)
也不在函数中,因此编译器仍然能够推断出第二个绑定的类型f
成为io::File
。