Rust 除了靈活的條件語(yǔ)句以外,循環(huán)結(jié)構(gòu)的設(shè)計(jì)也十分成熟。這一點(diǎn)作為身經(jīng)百戰(zhàn)的開(kāi)發(fā)者應(yīng)該能感覺(jué)出來(lái)。
while 循環(huán)是最典型的條件語(yǔ)句循環(huán):
fn main() { let mut number = 1; while number != 4 { println!("{}", number); number += 1; } println!("EXIT"); }
運(yùn)行結(jié)果:
1 2 3 EXIT
Rust 語(yǔ)言到此教程編撰之日還沒(méi)有 do-while 的用法,但是 do 被指定為保留字,也許以后的版本中會(huì)用到。
在 C 語(yǔ)言中 for 循環(huán)使用三元語(yǔ)句控制循環(huán),但是 Rust 中沒(méi)有這種用法,需要用 while 循環(huán)來(lái)代替:
int i; for (i = 0; i < 10; i++) { // 循環(huán)體 }
let mut i = 0; while i < 10 { // 循環(huán)體 i += 1; }
for 循環(huán)是最常用的循環(huán)結(jié)構(gòu),常用來(lái)遍歷一個(gè)線性數(shù)據(jù)據(jù)結(jié)構(gòu)(比如數(shù)組)。for 循環(huán)遍歷數(shù)組:
fn main() { let a = [10, 20, 30, 40, 50]; for i in a.iter() { println!("值為 : {}", i); } }
運(yùn)行結(jié)果:
值為 : 10 值為 : 20 值為 : 30 值為 : 40 值為 : 50
這個(gè)程序中的 for 循環(huán)完成了對(duì)數(shù)組 a 的遍歷。a.iter() 代表 a 的迭代器(iterator),在學(xué)習(xí)有關(guān)于對(duì)象的章節(jié)以前不做贅述。
當(dāng)然,for 循環(huán)其實(shí)是可以通過(guò)下標(biāo)來(lái)訪問(wèn)數(shù)組的:
fn main() { let a = [10, 20, 30, 40, 50]; for i in 0..5 { println!("a[{}] = {}", i, a[i]); } }
運(yùn)行結(jié)果:
a[0] = 10 a[1] = 20 a[2] = 30 a[3] = 40 a[4] = 50
身經(jīng)百戰(zhàn)的開(kāi)發(fā)者一定遇到過(guò)幾次這樣的情況:某個(gè)循環(huán)無(wú)法在開(kāi)頭和結(jié)尾判斷是否繼續(xù)進(jìn)行循環(huán),必須在循環(huán)體中間某處控制循環(huán)的進(jìn)行。如果遇到這種情況,我們經(jīng)常會(huì)在一個(gè) while (true) 循環(huán)體里實(shí)現(xiàn)中途退出循環(huán)的操作。
Rust 語(yǔ)言有原生的無(wú)限循環(huán)結(jié)構(gòu) —— loop:
fn main() { let s = ['R', 'U', 'N', 'O', 'O', 'B']; let mut i = 0; loop { let ch = s[i]; if ch == 'O' { break; } println!("\'{}\'", ch); i += 1; } }
運(yùn)行結(jié)果:
'R' 'U' 'N'
loop 循環(huán)可以通過(guò) break 關(guān)鍵字類(lèi)似于 return 一樣使整個(gè)循環(huán)退出并給予外部一個(gè)返回值。這是一個(gè)十分巧妙的設(shè)計(jì),因?yàn)?loop 這樣的循環(huán)常被用來(lái)當(dāng)作查找工具使用,如果找到了某個(gè)東西當(dāng)然要將這個(gè)結(jié)果交出去:
fn main() { let s = ['R', 'U', 'N', 'O', 'O', 'B']; let mut i = 0; let location = loop { let ch = s[i]; if ch == 'O' { break i; } i += 1; }; println!(" \'O\' 的索引為 {}", location); }
運(yùn)行結(jié)果:
'O' 的索引為 3