這部分咱們學習 rust 語言的 變量、數據類型、函數、註釋、流程控制
這五個方面的內容。前文介紹了前兩個內容,本文介紹後三個內容。javascript
函數在 rust 代碼廣泛存在,咱們也已經見過了它的主函數 main 函數了,它是進入程序的入口。咱們也見過了 fn 關鍵字了,它是用來聲明函數的。
特別說明一下:rust 語言的函數和變量都是以小寫字母和下劃線命名的,若是以其它方式命名,你會收到一個警告。java
函數是以 fn 關鍵字打頭,而後是函數名字和小括號,最後的大括號是用來告訴編譯器函數體的開始和結束。咱們也能夠經過函數名字和小括號來調用咱們定義的函數,定義的函數能夠在主函數前面,也能夠在主函數後面。rust 不關心定義的位置,只要你在某個地方定義了它。咱們來看個簡單的例子吧:程序員
fn main() { println!("Hello, world!"); another_function(); } fn another_function() { println!("另外一個函數"); }
運行結果:數組
cargo run Compiling hello_cargo v0.1.0 (/Users/shanpengfei/work/rust-work-space/study/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.57s Running `target/debug/hello_cargo` Hello, world! 另外一個函數
函數也能夠附帶一些參數,函數和參數共同構成函數聲明。當咱們調用函數的時候,也須要把函數須要的參數傳給它。咱們直接看個例子吧:ruby
fn main() { another_function(5, 6); } fn another_function(x: i32, y: i32) { println!("x 的值是: {}", x); println!("y 的值是: {}", y); }
運行的結果是:函數
cargo run Compiling hello_cargo v0.1.0 (/Users/shanpengfei/work/rust-work-space/study/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.23s Running `target/debug/hello_cargo` The value of x is: 5 The value of y is: 6
例子傳了兩個參數,5 傳給了 x,6 傳給了 y。oop
函數體是由一系列語句的集合,並以表達式結束組合而成的。咱們尚未使用過表達式結尾的函數,可是咱們即將看到表達式做爲函數體語句的一部分。由於 rust 是一種基於表達式的語言,這對於理解 rust 語言是很重要的,其餘語言沒有這樣的設計,接下來咱們來看一下這是一種什麼樣的設計。學習
咱們在以前章節也使用過語句和表達式。語句是一些操做的集合而不返回值,表達式是用來返回結果的。在其餘語言中,咱們能夠把代碼寫成 x = y = 6
,使得 x 和 y 都爲 6,可是在 rust 語言中不容許這樣。spa
表達式返回值是 rust 語言特有的風格:debug
5 + 6
就是一個返回 11 的表達式。let y = 6
中的返回值爲 6 的表達式。直接上代碼來看一下這一條說明吧:
fn main() { let x = 5; let y = { let x = 3; x + 1 }; println!("y 的值是: {}", y); }
在這裏,很容易看到的一個表達式是:
{ let x = 3; x + 1 };
由於這塊在 {} 建立的新做用域中,它返回的值是 4,而 4 這個值賦給 let 語句的變量 y 中。特別說明:x + 1 結尾不帶分號,由於表達式不能帶有分號,若是添加了分號,則會自動轉成語句,就不會返回 4 這個值了,這一點要牢記。
函數能夠給調用它的代碼返回函數計算結果。咱們不須要給返回值命名,可是須要在符號 -> 後面聲明返回值的類型。在 rust 中,函數返回值就是函數體結尾的表達式。固然咱們也能夠使用 return 關鍵字來返回值,可是大部分函數都是以最後的表達式做爲返回值的。咱們直接看例子吧:
fn main() { let x = plus_one(5); println!("x 的值是: {}", x); } fn plus_one(x: i32) -> i32 { x + 1 }
這裏的 let x = plus_one(5)
就至關於 let x = 6
。咱們定義了函數 plus_one,它的返回值類型是 i32,返回的值是 x + 1,這裏不能加分號。
全部的程序員都力求他們寫的程序能夠很容易地被其餘人理解,因此會在程序中寫一些說明。這些筆記、說明會被編譯器忽略,可是對於閱讀源碼的人是至關有用的。
在 rust 中,註釋是以兩個斜線開頭,直到行結束爲止。
在大部分程序語言中,是否運行這部分代碼取決於條件語句是否爲真,是否持續運行這部分代碼取決於條件是否持續爲真。這部分咱們來學習 rust 的判斷和循環兩種控制流程。
判斷語句根據條件來判斷執行哪一個分支的代碼。
全部的判斷表達式都是使用 if 打頭,而後緊跟條件表達式。咱們直接來看例:
fn main() { let number = 3; if number < 5 { println!("條件爲真"); } else { println!("條件爲假"); } }
若是變量 number 比 5 小,就打印 條件爲真,不然就打印 條件爲假。在 if 這裏也能夠考慮一下 match 關鍵字。再說一下 else 表達式,主要是提供一個條件爲假時的代碼,若是不提供 else 表達式,程序會直接跳過 if 表達式。
tips:if 後面的表達式必須是 bool 類型的,這點和 ruby、javascript語言是不一樣的。
咱們也能夠使用 if、else if、else 結合起來寫多條件判斷的代碼,直接看個例子:
fn main() { let number = 6; if number % 4 == 0 { println!("能被 4 整除"); } else if number % 3 == 0 { println!("能被 3 整除"); } else if number % 2 == 0 { println!("能被 2 整除"); } else { println!("不能被 2, 3, 4 整除"); } }
若是使用了太多的 else if 表達式會使代碼顯得很亂,能夠考慮 match 關鍵字來代替,後文再介紹這個內容。
由於 if 是個表達式,能夠使用 let 語句來接收 if 表達式返回的值。內容比較簡單,直接看代碼:
fn main() { let condition = true; let number = if condition { 5 } else { 6 }; println!("結果是: {}", number); }
運行的結果是:
cargo run Compiling hello_cargo v0.1.0 (/Users/shanpengfei/work/rust-work-space/study/hello_cargo) Finished dev [unoptimized + debuginfo] target(s) in 0.23s Running `target/debug/hello_cargo` 結果是: 5
if 和 else 返回值的類型必須是相同的。
關於循環,rust 提供了幾種循環的方法: loop、while、for,咱們依次看一下:
loop 關鍵字是告訴 rust 重複執行後面的代碼塊,直到代碼明確告訴 rust 中止,好比:
fn main() { loop { println!("重複打印"); } }
這裏會重複打印 重複打印
這 4 個字,直到咱們使用 ctrl-c 結束程序。還能夠在循環代碼塊中使用 break 關鍵字跳出循環。
loop 表達式也能夠和 if 表達式同樣返回一個值,賦給 let 語句。返回的表達式能夠跟在 break 關鍵字的後面。看個例子:
fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!("結果是 {}", result); }
代碼的結果是 20,相對比較簡單,不說了。
若是執行循環前須要進行條件判斷,則使用 while 關鍵字。當條件爲真時,執行循環體,循環體中也能夠使用 break 關鍵字來中止。這塊直接看個例子:
fn main() { let mut number = 3; while number != 0 { println!("{}!", number); number -= 1; } println!("結束"); }
由於這塊內容和其餘語言差很少,這裏就不講解了。
若是想要遍歷數組,則使用 for 關鍵字。固然也能夠使用 while 關鍵字,先看 while 關鍵字的例子:
fn main() { let a = [10, 20, 30, 40, 50]; let mut index = 0; while index < 5 { println!("值是: {}", a[index]); index += 1; } }
會根據索引依次打印數組中的 5 個值,再看 for 關鍵字的例子:
fn main() { let a = [10, 20, 30, 40, 50]; for element in a.iter() { println!("值是: {}", element); } }
這是使用的是迭代器 iter(),固然也能夠使用 Range 關鍵字,以下:
fn main() { for number in (1..4).rev() { println!("{}!", number); } println!("結束"); }
rev() 方法是把 1,2,3,4 倒序變量 4,3,2,1。
歡迎閱讀單鵬飛的學習筆記