我已經閱讀了幾個關于 SO 的答案,并收集了這些用例:
panic!當一個函式- 當函式中有無限回圈時
但我仍然不清楚為什么我們需要這樣定義函式:
fn func() -> ! {
panic!("Error!");
}
如果它的作業方式與此相同(沒有感嘆號):
fn func() {
panic!("Error!");
}
同時,為什么我們需要!在具有無限回圈的函式中使用?看起來這個簽名并沒有帶來任何真實的使用資訊。
uj5u.com熱心網友回復:
這些簽名之間的主要區別歸結為!可以強制轉換為任何其他型別的事實,因此與任何其他型別兼容(由于從未采用此代碼路徑,我們可以假設它是我們需要的任何型別)。當我們有多個可能的代碼路徑時,這一點很重要,例如if-elseor match。
例如,考慮以下(可能是人為的,但希望足夠清晰)代碼:
fn assert_positive(v: i32) -> u32 {
match v.try_into() {
Ok(v) => v,
Err(_) => func(),
}
}
當func宣告為 return!時,該函式編譯成功。如果我們洗掉回傳型別,func將被宣告為回傳(),并且編譯中斷:
error[E0308]: `match` arms have incompatible types
--> src/main.rs:8:19
|
6 | / match v.try_into() {
7 | | Ok(v) => v,
| | - this is found to be of type `u32`
8 | | Err(_) => func(),
| | ^^^^^^ expected `u32`, found `()`
9 | | }
| |_____- `match` arms have incompatible types
您還可以將其與以下定義進行Result::unwrap比較:
pub fn unwrap(self) -> T {
match self {
Ok(t) => t,
Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", &e),
}
}
這里,unwrap_failed是回傳!,所以它與回傳的任何型別相結合,Ok以防萬一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418834.html
標籤:
上一篇:使用C中的遞回函式反轉數字
