Rust 語(yǔ)言是一種高效、可靠的通用高級(jí)語(yǔ)言。其高效不僅限于開(kāi)發(fā)效率,它的執(zhí)行效率也是令人稱贊的,是一種少有的兼顧開(kāi)發(fā)效率和執(zhí)行效率的語(yǔ)言。
Rust 語(yǔ)言由 Mozilla 開(kāi)發(fā),最早發(fā)布于 2014 年 9 月。Rust 的編譯器是在 MIT License 和 Apache License 2.0 雙重協(xié)議聲明下的免費(fèi)開(kāi)源軟件。
Rust 官方在線工具: https://play.rust-lang.org/。
一、Rust 語(yǔ)言的特點(diǎn)
-
高性能:Rust 速度驚人且內(nèi)存利用率極高。由于沒(méi)有運(yùn)行時(shí)和垃圾回收,它能夠勝任對(duì)性能要求特別高的服務(wù),可以在嵌入式設(shè)備上運(yùn)行,還能輕松和其他語(yǔ)言集成。
-
可靠性:Rust 豐富的類型系統(tǒng)和所有權(quán)模型保證了內(nèi)存安全和線程安全,在編譯期就能夠消除各種各樣的錯(cuò)誤。
-
生產(chǎn)力:Rust 擁有出色的文檔、友好的編譯器和清晰的錯(cuò)誤提示信息,還集成了一流的工具 —— 包管理器和構(gòu)建工具, 智能地自動(dòng)補(bǔ)全和類型檢驗(yàn)的多編輯器支持,以及自動(dòng)格式化代碼等等。
二、基礎(chǔ)語(yǔ)法
第一個(gè) Rust 程序
Rust 語(yǔ)言代碼文件后綴名為 .rs, 如 helloworld.rs。
fn main() {
println!("Hello World!");
}
使用 rustc 命令編譯 helloworld.rs 文件:
$ rustc helloworld.rs # 編譯 helloworld.rs 文件
編譯后會(huì)生成 helloworld 可執(zhí)行文件:
$ ./helloworld # 執(zhí)行 helloworld
Hello World!
2.1 簡(jiǎn)要介紹 println!() 和 print!()
println!( “Hello World”) 中的 println 后面還有一個(gè) !
符號(hào),println 不是一個(gè)函數(shù),而是一個(gè)宏規(guī)則。
Rust 輸出文字的方式主要有兩種:println!()
和 print!()
。這兩個(gè)"函數(shù)"都是向命令行輸出字符串的方法,區(qū)別僅在于前者會(huì)在輸出的最后附加輸出一個(gè)換行符。當(dāng)用這兩個(gè)"函數(shù)"輸出信息的時(shí)候,第一個(gè)參數(shù)是格式字符串,后面是一串可變參數(shù),對(duì)應(yīng)著格式字符串中的"占位符",這一點(diǎn)與 C 語(yǔ)言中的 printf
函數(shù)很相似。但是,Rust 中格式字符串中的占位符不是 “% + 字母” 的形式,而是一對(duì) {}
。
fn main() {
let a = 12;
let b = 12.5;
println!("a is {}, b is {}", a, b);
}
運(yùn)行結(jié)果:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-814291.html
a is 12, b is 12.5
如果想把 a 輸出兩遍,那豈不是要寫成:
println!("a is {}, a again is {}", a, a);
其實(shí)有更好的寫法:
println!("a is {0}, a again is {0}", a);
在 {} 之間可以放一個(gè)數(shù)字,它將把之后的可變參數(shù)當(dāng)作一個(gè)數(shù)組來(lái)訪問(wèn),下標(biāo)從 0 開(kāi)始。
如果要輸出 { 或 } 怎么辦呢?格式字符串中通過(guò) {{ 和 }} 分別轉(zhuǎn)義代表 { 和 }。但是其他常用轉(zhuǎn)義字符與 C 語(yǔ)言里的轉(zhuǎn)義字符一樣,都是反斜杠開(kāi)頭的形式。
fn main() {
println!("{{}}");
}
以上程序的輸出結(jié)果是:
{}
2.2 變量
Rust 是強(qiáng)類型語(yǔ)言,但具有自動(dòng)判斷變量類型的能力。這很容易讓人與弱類型語(yǔ)言產(chǎn)生混淆。如果要聲明變量,需要使用 let
關(guān)鍵字。例如:let a = 123;
,只學(xué)習(xí)過(guò) JavaScript 的開(kāi)發(fā)者對(duì)這句話很敏感,只學(xué)習(xí)過(guò) C 語(yǔ)言的開(kāi)發(fā)者對(duì)這句話很不理解。
在這句聲明語(yǔ)句之后,以下三行代碼都是被禁止的:
a = "abc";
a = 4.56;
a = 456;
第一行的錯(cuò)誤在于當(dāng)聲明 a 是 123 以后,a 就被確定為整型數(shù)字,不能把字符串類型的值賦給它。
第二行的錯(cuò)誤在于自動(dòng)轉(zhuǎn)換數(shù)字精度有損失,Rust 語(yǔ)言不允許精度有損失的自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換。
第三行的錯(cuò)誤在于 a 不是個(gè)可變變量。
Rust 語(yǔ)言為了高并發(fā)安全而做的設(shè)計(jì):在語(yǔ)言層面盡量少的讓變量的值可以改變。所以 a 的值不可變。但這不意味著 a 不是"變量"(英文中的 variable),官方文檔稱 a 這種變量為不可變變量。
如果我們編寫的程序的一部分在假設(shè)值永遠(yuǎn)不會(huì)改變的情況下運(yùn)行,而我們代碼的另一部分在改變?cè)撝?,那么代碼的第一部分可能就不會(huì)按照設(shè)計(jì)的意圖去運(yùn)轉(zhuǎn)。由于這種原因造成的錯(cuò)誤很難在事后找到。這是 Rust 語(yǔ)言設(shè)計(jì)這種機(jī)制的原因。
當(dāng)然,使變量變得"可變"(mutable)只需一個(gè) mut
關(guān)鍵字。
fn main() {
let mut a = 123;
println!("a is {}", a);
a = 456;
println!("a is {}", a);
}
這個(gè)程序是正確的。
a is 123
a is 456
常量與不可變變量的區(qū)別
既然不可變變量是不可變的,那不就是常量嗎?為什么叫變量?變量和常量還是有區(qū)別的。在 Rust 中,以下程序是合法的:
let a = 123; // 可以編譯,但可能有警告,因?yàn)樵撟兞繘](méi)有被使用
let a = 456;
但是如果 a 是常量就不合法:
const a: i32 = 123;
let a = 456;
報(bào)錯(cuò)如下:
Compiling playground v0.0.1 (/playground)
error[E0005]: refutable pattern in local binding
--> src/main.rs:3:9
|
3 | let a = 456;
| ^
| |
| patterns `i32::MIN..=122_i32` and `124_i32..=i32::MAX` not covered
| missing patterns are not covered because `a` is interpreted as a constant pattern, not a new variable
| help: introduce a variable instead: `a_var`
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
= note: the matched value is of type `i32`
變量的值可以"重新綁定",但在"重新綁定"以前不能私自被改變,這樣可以確保在每一次"綁定"之后的區(qū)域里編譯器可以充分的推理程序邏輯。 雖然 Rust 有自動(dòng)判斷類型的功能,但有些情況下聲明類型更加方便:
let a: u64 = 123;
這里聲明了 a 為無(wú)符號(hào) 64 位整型變量,如果沒(méi)有聲明類型,a 將自動(dòng)被判斷為有符號(hào) 32 位整型變量,這對(duì)于 a 的取值范圍有很大的影響。
2.3 重影(Shadowing)
重影的概念與其他面向?qū)ο笳Z(yǔ)言里的"重寫"(Override)或"重載"(Overload)是不一樣的。重影就是所謂的重新綁定。
重影就是指變量的名稱可以被重新使用的機(jī)制:
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
運(yùn)行結(jié)果:
The value of x is: 12
再來(lái)看一個(gè)例子
fn main() {
let x = 5; // warning: unused variable: `x`
let x = 1.5;
let x = x * 2.0;
println!("The value of x is: {}", x);
}
運(yùn)行結(jié)果:
The value of x is: 3
重影與可變變量的賦值不是一個(gè)概念,重影是指用同一個(gè)名字重新代表另一個(gè)變量實(shí)體,其類型、可變屬性和值都可以變化。但可變變量賦值僅能發(fā)生值的變化。
let mut s = "123";
s = s.len();
這段程序會(huì)出錯(cuò):不能給字符串變量賦整型值。
2.4 數(shù)據(jù)類型
Rust 語(yǔ)言中的基礎(chǔ)數(shù)據(jù)類型有以下幾種。
2.4.1 整型(Integer)
整數(shù)型簡(jiǎn)稱整型,按照比特位長(zhǎng)度和有無(wú)符號(hào)分為以下種類:
位長(zhǎng)度 | 有符號(hào) | 無(wú)符號(hào) |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
isize 和 usize 兩種整數(shù)類型是用來(lái)衡量數(shù)據(jù)大小的,它們的位長(zhǎng)度取決于所運(yùn)行的目標(biāo)平臺(tái),如果是 32 位架構(gòu)的處理器將使用 32 位位長(zhǎng)度整型。
整數(shù)的表述方法有以下幾種:
進(jìn)制 | 例 |
---|---|
十進(jìn)制 | 98_222 |
十六進(jìn)制 | 0xff |
八進(jìn)制 | 0o77 |
二進(jìn)制 | 0b1111_0000 |
字節(jié)(只能表示 u8 型) | b’A’ |
有的整數(shù)中間存在一個(gè)下劃線,這種設(shè)計(jì)可以讓人們?cè)谳斎胍粋€(gè)很大的數(shù)字時(shí)更容易判斷數(shù)字的值大概是多少。
例如:
fn main() {
let x = 598_000;
println!("The value of x is: {}", x);
}
運(yùn)行結(jié)果:
The value of x is: 598000
2.4.2 浮點(diǎn)數(shù)型(Floating-Point)
Rust 與其它語(yǔ)言一樣支持 32 位浮點(diǎn)數(shù)(f32)和 64 位浮點(diǎn)數(shù)(f64)。默認(rèn)情況下,64.0 將表示 64 位浮點(diǎn)數(shù),因?yàn)楝F(xiàn)代計(jì)算機(jī)處理器對(duì)兩種浮點(diǎn)數(shù)計(jì)算的速度幾乎相同,但 64 位浮點(diǎn)數(shù)精度更高。
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
數(shù)學(xué)運(yùn)算
用一段程序反映數(shù)學(xué)運(yùn)算:
fn main() {
let sum = 5 + 10; // 加
let difference = 95.5 - 4.3; // 減
let product = 4 * 30; // 乘
let quotient = 56.7 / 32.2; // 除
let remainder = 43 % 5; // 求余
}
許多運(yùn)算符號(hào)之后加上 = 號(hào)是自運(yùn)算的意思,例如:
sum += 1
等同于 sum = sum + 1
。
注意:Rust 不支持 ++ 和 --,因?yàn)檫@兩個(gè)運(yùn)算符出現(xiàn)在變量的前后會(huì)影響代碼可讀性,減弱了開(kāi)發(fā)者對(duì)變量改變的意識(shí)能力。
2.4.3 布爾型
布爾型用 bool 表示,值只能為 true 或 false。
2.4.4 字符型
字符型用 char 表示。Rust 的 char 類型大小為 4 個(gè)字節(jié),代表 Unicode 標(biāo)量值,這意味著它可以支持中文、日文和韓文等非英文字符,甚至表情符號(hào)和零寬度空格在 Rust 中都是有效的 char 值。
Rust 使用 char 類型表示單個(gè)字符,但對(duì)字符串或文本流使用 UTF-8 編碼。因此,String 將其文本表示為一個(gè) UTF-8 字節(jié)的序列,而不是字符的數(shù)組。Rust 的 char 類型是語(yǔ)言中最原生的字母類型,例如:
fn main() {
let c = 'z';
let z = '?';
let heart_eyed_cat = '?';
println!("The value is: {} {} {}", c, z, heart_eyed_cat);
}
運(yùn)行結(jié)果:
The value is: z ? ?
Rust 還是提供了字節(jié)字面量(byte literal),即用類字符字面量表示的 u8 值:b’X’ 表示 ASCII 編碼的字符 X,它是一個(gè) u8 值。比如,由于字符 A 的 ASCII 編碼是 65,因此 b’A’ 等于 65u8。字節(jié)字面量中只能出現(xiàn) ASCII 編碼的字符。
注意:由于中文文字編碼有兩種(GBK 和 UTF-8),所以編程中使用中文字符串有可能導(dǎo)致亂碼的出現(xiàn),這是因?yàn)樵闯绦蚺c命令行的文字編碼不一致,所以在 Rust 中字符串和字符都必須使用 UTF-8 編碼,否則編譯器會(huì)報(bào)錯(cuò)。
2.4.5 復(fù)合類型
元組是用一對(duì) ( )
包括的一組數(shù)據(jù),可以包含不同種類的數(shù)據(jù):
let tup: (i32, f64, u8) = (500, 6.4, 1);
// tup.0 等于 500
// tup.1 等于 6.4
// tup.2 等于 1
let (x, y, z) = tup;
// y 等于 6.4
程序首先創(chuàng)建了一個(gè)元組并綁定到 tup
變量上。接著使用了 let
和一個(gè)模式將 tup
分成了三個(gè)不同的變量 x、y 和 z。這叫做解構(gòu)(destructuring),因?yàn)樗鼘⒁粋€(gè)元組拆成了三個(gè)部分。
我們也可以使用點(diǎn)號(hào)(.)后跟值的索引來(lái)直接訪問(wèn)它們。例如:
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
}
這個(gè)程序創(chuàng)建了一個(gè)元組 x,然后使用其各自的索引訪問(wèn)元組中的每個(gè)元素。跟大多數(shù)編程語(yǔ)言一樣,元組的第一個(gè)索引值是 0。
不帶任何值的元組有個(gè)特殊的名稱,叫做單元(unit) 元組。這種值以及對(duì)應(yīng)的類型都寫作 ()
,表示空值或空的返回類型。如果表達(dá)式不返回任何其他值,則會(huì)隱式返回單元值。
數(shù)組用一對(duì) [ ]
包括的同類型數(shù)據(jù)。
let a = [1, 2, 3, 4, 5]; // a 是一個(gè)長(zhǎng)度為 5 的整型數(shù)組
let b = ["January", "February", "March"]; // b 是一個(gè)長(zhǎng)度為 3 的字符串?dāng)?shù)組
let c: [i32; 5] = [1, 2, 3, 4, 5]; // c 是一個(gè)長(zhǎng)度為 5 的 i32 數(shù)組
let d = [3; 5]; // 等同于 let d = [3, 3, 3, 3, 3];
let first = a[0]; // 數(shù)組訪問(wèn)
let second = a[1];
a[0] = 123; // 錯(cuò)誤:數(shù)組 a 不可變
let mut a = [1, 2, 3];
a[0] = 4; // 正確
2.5 注釋
Rust 中的注釋方式與其它語(yǔ)言(C、Java)一樣,雙斜杠的注釋方式前面已經(jīng)接觸過(guò),實(shí)際上支持三種注釋方式:
// 這是第一種注釋方式
/* 這是第二種注釋方式 */
/*
* 多行注釋
* 多行注釋
* 多行注釋
*/
在 Rust 中使用 // 可以使其之后到第一個(gè)換行符的內(nèi)容變成注釋。
在這種規(guī)則下,三個(gè)正斜杠 /// 依然是合法的注釋開(kāi)始。所以 Rust 可以用 /// 作為說(shuō)明文檔注釋的開(kāi)頭:
///?Adds?one?to?the?number?given.
///
///?#?Examples
///
///?```
///?let x = add(1, 2);
///
///?```
fn add(a: i32, b: i32) -> i32 {
return a + b;
}
fn main() {
println!("{}",add(2, 3));
}
IDE 中加載的效果如下:
2.6 函數(shù)
函數(shù)實(shí)際上前面已經(jīng)有所了解,運(yùn)行示例一直在使用 main 函數(shù)。Rust 函數(shù)的基本形式:
fn <函數(shù)名> ( <參數(shù)> ) -> <返回值類型> <函數(shù)體>
其中 Rust 函數(shù)名稱的命名風(fēng)格是小寫字母以下劃線分割:
fn main() {
println!("Hello, world!");
another_fn();
}
fn another_fn() {
println!("Hello, another_fn!");
}
2.6.1 函數(shù)參數(shù)
Rust 中定義函數(shù)如果需要具備參數(shù)必須聲明參數(shù)名稱和類型:
fn main() {
another_fn(100, 6);
}
fn another_fn(x: i32, y: i32) {
println!("The value of x is {}. The value of y is {}", x, y);
}
運(yùn)行結(jié)果:
The value of x is 100. The value of y is 6
2.6.2 函數(shù)體表達(dá)式
Rust 中可以在一個(gè)用 {}
包括的塊里編寫一個(gè)較為復(fù)雜的表達(dá)式:
fn main() {
let x = 100;
let y = {
let x = 20;
x + 1
};
println!("The value of x is {}. The value of y is {}", x, y);
}
運(yùn)行結(jié)果:
The value of x is 100. The value of y is 21
很顯然,這段程序中包含了一個(gè)表達(dá)式塊:
let y = {
let x = 20;
x + 1
};
而且在塊中可以使用函數(shù)語(yǔ)句,最后一個(gè)步驟是表達(dá)式,此表達(dá)式的結(jié)果值是整個(gè)表達(dá)式塊所代表的值。這種表達(dá)式塊叫做函數(shù)體表達(dá)式。
注意:x + 1
之后沒(méi)有分號(hào),否則它將變成一條語(yǔ)句!
這種表達(dá)式塊是一個(gè)合法的函數(shù)體。而且在 Rust 中,函數(shù)定義可以嵌套:
fn main() {
fn five() -> i32 {
5
}
println!("The value of five() is {}.", five());
}
運(yùn)行結(jié)果:
The value of five() is 5.
2.6.3 函數(shù)返回值
Rust 函數(shù)聲明返回值類型的方式為在參數(shù)聲明之后用 ->
來(lái)聲明函數(shù)返回值的類型。在函數(shù)體中,隨時(shí)都可以以 return
關(guān)鍵字結(jié)束函數(shù)運(yùn)行并返回一個(gè)類型合適的值。這也是最接近大多數(shù)開(kāi)發(fā)者經(jīng)驗(yàn)的做法:
fn add(a: i32, b: i32) -> i32 {
return a + b;
}
但是 Rust 不支持自動(dòng)返回值類型判斷!如果沒(méi)有明確聲明函數(shù)返回值的類型,函數(shù)將被認(rèn)為是"純過(guò)程",不允許產(chǎn)生返回值,return 后面不能有返回值表達(dá)式。
注意:函數(shù)體表達(dá)式并不能等同于函數(shù)體,它不能使用 return 關(guān)鍵字。
2.7 條件語(yǔ)句
在 Rust 語(yǔ)言中的條件語(yǔ)句是這種格式的:
fn main() {
let number = 3;
if number < 5 {
println!("true");
} else {
println!("false");
}
}
在上述程序中有條件 if 語(yǔ)句,這個(gè)語(yǔ)法在很多其它語(yǔ)言中很常見(jiàn),但也有一些區(qū)別:首先,條件表達(dá)式 number < 5 不需要用小括號(hào)包括(注意,不需要不是不允許);但是 Rust 中的 if 不存在單語(yǔ)句不用加 {} 的規(guī)則,不允許使用一個(gè)語(yǔ)句代替一個(gè)塊。盡管如此,Rust 還是支持傳統(tǒng) else-if 語(yǔ)法的:
fn main() {
let x = 100;
let y;
if x > 0 {
y = 1;
}
else if (x < 0) { // warning: unnecessary parentheses around `if` condition
y = -1;
}
else {
y = 0;
}
println!("The value of y is {}", y);
}
以上第二個(gè)判斷條件 else if (x < 0)
加了圓括號(hào),編譯運(yùn)行的時(shí)候會(huì)有相關(guān)警告。
運(yùn)行結(jié)果:
The value of y is 1
Rust 中的條件表達(dá)式必須是 bool 類型,例如下面的程序是錯(cuò)誤的:
fn main() {
let number = 100;
if number { // error[E0308]: mismatched types,expected `bool`, found integer
println!("true");
}
}
雖然 C/C++ 語(yǔ)言中的條件表達(dá)式用整數(shù)表示,非 0 即真,但這個(gè)規(guī)則在很多注重代碼安全性的語(yǔ)言中是被禁止的。
在 Rust 中我們可以使用 if-else 結(jié)構(gòu)實(shí)現(xiàn)類似于三元條件運(yùn)算表達(dá)式 (A ? B : C) 的效果:
fn main() {
let x = 100;
let y = if x > 0 { 1 } else { -1 };
println!("The value of y is {}", y);
}
運(yùn)行結(jié)果:
The value of y is 1
注意:兩個(gè)函數(shù)體表達(dá)式的類型必須一樣,且必須有一個(gè) else 及其后的表達(dá)式塊。
2.8 循環(huán)
Rust 除了靈活的條件語(yǔ)句以外,循環(huán)結(jié)構(gòu)的設(shè)計(jì)也十分成熟。
2.8.1 while 循環(huán)
while 循環(huán)是最典型的條件語(yǔ)句循環(huán):
fn main() {
let mut number = 0;
while number != 5 {
println!("{}", number);
number += 1;
}
println!("EXIT");
}
運(yùn)行結(jié)果:
0
1
2
3
4
EXIT
Rust 語(yǔ)言到目前還沒(méi)有 do-while 的用法,但是 do
被規(guī)定為保留字,也許以后的版本中會(huì)用到。
fn main() {
let mut number = 0;
do {
println!("{}", number);
number += 1;
} while number != 5;
println!("EXIT");
}
以上代碼編譯會(huì)報(bào)錯(cuò):error: expected expression, found reserved keyword do
在 C 語(yǔ)言中 for 循環(huán)使用三元語(yǔ)句控制循環(huán):
int i;
for (i = 0; i < 10; i++) {
// 循環(huán)體
}
但是 Rust 中沒(méi)有這種用法,需要用 while 循環(huán)來(lái)代替:
let mut i = 0;
while i < 10 {
// 循環(huán)體
i += 1;
}
2.8.2 for 循環(huán)
for 循環(huán)是最常用的循環(huán)結(jié)構(gòu)。比如 for 循環(huán)遍歷數(shù)組:
fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
for value in a.iter() {
println!("The value of a[{}] is {}", index, value);
index += 1;
}
}
運(yùn)行結(jié)果:
The value of a[0] is 10
The value of a[1] is 20
The value of a[2] is 30
The value of a[3] is 40
The value of a[4] is 50
這個(gè)程序中的 for 循環(huán)完成了對(duì)數(shù)組 a 的遍歷。a.iter() 代表 a 的迭代器(iterator),實(shí)際上,for 循環(huán)其實(shí)是可以通過(guò)下標(biāo)來(lái)訪問(wèn)數(shù)組的:
fn main() {
let a = [10, 20, 30, 40, 50];
for index in 0..5 {
println!("The value of a[{}] is {}", index, a[index]);
}
}
運(yùn)行結(jié)果和上面是一樣的。注意此處 0…5 這個(gè)范圍使用時(shí)包含了 0,卻未包含 5。
2.8.3 loop 循環(huán)
Rust 語(yǔ)言有原生的無(wú)限循環(huán)結(jié)構(gòu) —— loop:
fn main() {
let s = ['L', 'O', 'O', 'P', 'E', 'R'];
let mut i = 0;
loop {
let ch = s[i];
if ch == 'E' {
break;
}
println!("The value of s[{}] is {}", i, ch);
i += 1;
}
}
運(yùn)行結(jié)果:
The value of s[0] is L
The value of s[1] is O
The value of s[2] is O
The value of s[3] is P
loop 循環(huán)可以通過(guò) break
關(guān)鍵字類似于 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 = ['L', 'O', 'O', 'P', 'E', 'R'];
let mut i = 0;
let location = loop {
let ch = s[i];
if ch == 'E' {
break i;
}
println!("The value of s[{}] is {}", i, ch);
i += 1;
};
println!("The index of \'E\' is {}", location);
}
運(yùn)行結(jié)果:
The value of s[0] is L
The value of s[1] is O
The value of s[2] is O
The value of s[3] is P
The index of 'E' is 4
2.8.4 循環(huán)標(biāo)簽
如果存在嵌套循環(huán),break
和 continue
應(yīng)用于此時(shí)最內(nèi)層的循環(huán)。選擇在一個(gè)循環(huán)上指定一個(gè)循環(huán)標(biāo)簽(loop label),然后將標(biāo)簽與 break
或 continue
一起使用,使這些關(guān)鍵字應(yīng)用于已標(biāo)記的循環(huán)而不是最內(nèi)層的循環(huán)。
fn main() {
let mut count = 0;
'counting_up: loop {
println!("count = {count}");
let mut remaining = 10;
loop {
println!("remaining = {remaining}");
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("End count = {count}");
}
外層循環(huán)有一個(gè)標(biāo)簽 counting_up
,它將從 0 數(shù)到 2。沒(méi)有標(biāo)簽的內(nèi)部循環(huán)從 10 向下數(shù)到 9。第一個(gè)沒(méi)有指定標(biāo)簽的 break
將只退出內(nèi)層循環(huán)。break 'counting_up;
語(yǔ)句將退出外層循環(huán)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-814291.html
運(yùn)行結(jié)果:
count = 0
remaining = 10
remaining = 9
count = 1
remaining = 10
remaining = 9
count = 2
remaining = 10
End count = 2
參考鏈接
- Rust 官方網(wǎng)站:https://www.rust-lang.org/zh-CN
- Rust 官方文檔:https://doc.rust-lang.org/
- Rust Play:https://play.rust-lang.org/
到了這里,關(guān)于Rust 程序設(shè)計(jì)語(yǔ)言學(xué)習(xí)——基礎(chǔ)語(yǔ)法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!