我對 Rust 和一般的低級語言非常陌生。我注意到在下面的代碼中,如果我替換loop為while true代碼不再編譯。我實際上希望該版本loop也不會編譯,因為 return 陳述句位于 if 陳述句中,因此并非所有代碼路徑都會回傳一個值。
pub fn two_sum(numbers: Vec<i32>, target: i32) -> Vec<i32> {
let mut left = 0;
let mut right = numbers.len() - 1;
loop {
while numbers[left] numbers[right] > target {
right -= 1;
}
if numbers[left] numbers[right] == target {
break vec![left as i32 1, right as i32 1];
} else {
left = 1;
}
}
}
我也愿意接受有關如何使上面的代碼更符合 Rust 習慣的建議!
uj5u.com熱心網友回復:
那是因為loop編譯器更好地理解了 的控制流:
- 編譯器知道 a
loop至少執行一次 - a
loop沒有breakhas 型別!(從不),它與所有型別統一(在型別系統術語中,它是“底部”型別),帶有breakhas type的回圈,帶有 value()的回圈break具有任何 typebreak的值 - 這意味著編譯器可以推斷回圈終止(或缺少回圈終止),如果回圈不包含
break陳述句,它知道回圈后面的代碼已死,它永遠無法執行
這些都不是while回圈的情況,沒有特殊情況 for while true, or while false,它們的處理方式與任何其他while回圈沒有任何不同:就編譯器而言,它們都可以運行 0 次迭代
因此:
let mut a;
loop {
a = 1;
break;
}
a
編譯但
let mut a;
while true {
a = 1;
break;
}
a
不編譯。這也是為什么loop 可以有結果值但while不能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/489182.html
上一篇:bash/awk:從欄位中過濾值
