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

时间:2017-10-11 20:35:54

标签: rust

阅读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中的匹配表达式是不确定的类型?

1 个答案:

答案 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