2017-10-11 39 views
3

我最近看到一個這樣的代碼:在Rust中使用`!`作爲返回類型是什麼?

fn read() -> ! { 
    unimplemented!() 
} 

fn read2() { 
} 

fn main() { 
    read2(); 
    read(); 
} 

我找不到有關!任何信息的fn read()返回類型的任何地方,所以我沒有任何想法,這是什麼和什麼。

我發現的唯一的事情似乎是毫無意義我:

使用!作爲返回類型指示鏽編譯器這個功能不會返回

我不明白,因爲省略類型它做什麼也說,該函數返回也不做(unit類型實際上)。

+2

返回沒有不一樣的永不返回。 – Lee

+0

@Lee所以你似乎知道答案,你可以在這裏回答一個詳細的解釋。 –

+1

好吧,我會等待Rust程序員回答,但我相信'!'是空的類型,所以具有該返回類型的函數將永遠不會正常返回(例如,它會導致程序恐慌或終止)。相比之下,'()'是一個具有一個值的類型,因此具有該返回類型的函數只會因其副作用而被執行。 – Lee

回答

2

單位()不是什麼,它一個類型,其中一個可能的值也寫作()

此外,當一個函數返回單位(或者說「無」),它實際上返回。 Never類型!指定函數從不返回,,即退出程序。

這通常是一個panic宏的返回類型:

let s = match i { 
    1 => "one", 
    2 => "two", 
    _ => panic!("Error"), 
} 

在這個例子中,注意!可以「採取的作用」的所有類型。編譯器不會抱怨一個分支的類型爲&str,另一個分支的類型爲!

爲了您的信息,這裏是一個little history of the Never type