2017-10-11 53 views
2

閱讀防鏽教程中,我發現下面的代碼片段:鏽匹配表達式類型不確定?

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中的匹配表達式是類型不確定的?

+4

我覺得'返回Err(e)'沒有設置'f'的值,它打破了'match'並從函數返回一個值。 – Blorgbeard

+0

@LukasKalbertodt:如果'f'具有'std :: fs :: File'類型,那麼'f'可能具有'std :: fs :: File'類型,因此不是'Result <_, _>'。類型不確定意味着'f'可能有兩種不相等的類型之一。 – George

回答

5

不,類型不是不確定的。您首先創建了一個類型爲Result<io::File, io::Error>的綁定。然後,你正在創建一個f類型的f的新(可變)綁定(因爲變種Result enum包含在你的情況中)這個新的綁定遮住了舊的綁定,就像是一個塊, 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 

在鏽病,let可以被認爲是類似地引入一個新的範圍,遮蔽先前結合。

既然你也return你的功能的當你遇到一個Err(_),編譯器仍然能夠推斷出第二結合fio::File的類型。

相關問題