Rust 入門 (三)_下

這部分咱們學習 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 的表達式。
  • 表達式也是語句的一部分,好比 6 是語句 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

全部的判斷表達式都是使用 if 打頭,而後緊跟條件表達式。咱們直接來看例:

fn main() {
    let number = 3;

    if number < 5 {
        println!("條件爲真");
    } else {
        println!("條件爲假");
    }
}

若是變量 number 比 5 小,就打印 條件爲真,不然就打印 條件爲假。在 if 這裏也能夠考慮一下 match 關鍵字。再說一下 else 表達式,主要是提供一個條件爲假時的代碼,若是不提供 else 表達式,程序會直接跳過 if 表達式。



tips:if 後面的表達式必須是 bool 類型的,這點和 ruby、javascript語言是不一樣的。

else if

咱們也能夠使用 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 關鍵字來代替,後文再介紹這個內容。

使用 let 接收 if 的值

由於 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

loop 關鍵字是告訴 rust 重複執行後面的代碼塊,直到代碼明確告訴 rust 中止,好比:

fn main() {
    loop {
        println!("重複打印");
    }
}

這裏會重複打印 重複打印 這 4 個字,直到咱們使用 ctrl-c 結束程序。還能夠在循環代碼塊中使用 break 關鍵字跳出循環。

使用 let 接收 loop 的值

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

若是執行循環前須要進行條件判斷,則使用 while 關鍵字。當條件爲真時,執行循環體,循環體中也能夠使用 break 關鍵字來中止。這塊直接看個例子:

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number -= 1;
    }

    println!("結束");
}

由於這塊內容和其餘語言差很少,這裏就不講解了。

for

若是想要遍歷數組,則使用 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。

歡迎閱讀單鵬飛的學習筆記

相關文章
相關標籤/搜索