自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust編程基礎(chǔ)之函數(shù)和表達(dá)式

開發(fā) 前端
我們可以定義為擁有 參數(shù)(parameters)的函數(shù),參數(shù)是特殊變量,是函數(shù)簽名的一部分。當(dāng)函數(shù)擁有參數(shù)(形參)時(shí),可以為這些參數(shù)提供具體的值(實(shí)參)。

1.Rust函數(shù)

在之前的文章中,我們已經(jīng)見到了一個(gè)函數(shù):main函數(shù), 它是很多程序的入口點(diǎn)。也見過 fn 關(guān)鍵字,它用來聲明新函數(shù)。

Rust 代碼中的函數(shù)和變量名使用 snake case 規(guī)范風(fēng)格。在 snake case 中,所有字母都是小寫并使用下劃線分隔單詞。這是一個(gè)包含函數(shù)定義示例的程序:

fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");
}

我們?cè)?Rust 中通過輸入 fn 后面跟著函數(shù)名和一對(duì)圓括號(hào)來定義函數(shù)。大括號(hào)告訴編譯器哪里是函數(shù)體的開始和結(jié)尾。

可以使用函數(shù)名后跟圓括號(hào)來調(diào)用我們定義過的任意函數(shù)。因?yàn)槌绦蛑幸讯x another_function 函數(shù),所以可以在 main 函數(shù)中調(diào)用它。注意,源碼中 another_function 定義在 main 函數(shù) 之后;也可以定義在之前。Rust 不關(guān)心函數(shù)定義所在的位置,只要函數(shù)被調(diào)用時(shí)出現(xiàn)在調(diào)用之處可見的作用域內(nèi)就行。

將上面的代碼編譯執(zhí)行, 會(huì)看到有以下輸出:

圖片圖片

main 函數(shù)中的代碼會(huì)按順序執(zhí)行。首先,打印 “Hello, world!” 信息,然后調(diào)用 another_function 函數(shù)并打印它的信息。

2 函數(shù)參數(shù)

我們可以定義為擁有 參數(shù)(parameters)的函數(shù),參數(shù)是特殊變量,是函數(shù)簽名的一部分。當(dāng)函數(shù)擁有參數(shù)(形參)時(shí),可以為這些參數(shù)提供具體的值(實(shí)參)。

在another_function 中,增加了一個(gè)參數(shù):

fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("The value of x is: {x}");
}

嘗試運(yùn)行程序,將會(huì)輸出如下內(nèi)容:

圖片圖片

another_function 的聲明中有一個(gè)命名為 x 的參數(shù)。x 的類型被指定為 i32。當(dāng)我們將 5 傳給 another_function 時(shí),println! 宏會(huì)把 5 放在格式字符串中包含 x 的那對(duì)花括號(hào)的位置。

在函數(shù)簽名中,必須 聲明每個(gè)參數(shù)的類型。這是 Rust 設(shè)計(jì)中一個(gè)經(jīng)過慎重考慮的決定:要求在函數(shù)定義中提供類型注解,意味著編譯器再也不需要你在代碼的其他地方注明類型來指出你的意圖。而且,在知道函數(shù)需要什么類型后,編譯器就能夠給出更有用的錯(cuò)誤消息。

當(dāng)定義多個(gè)參數(shù)時(shí),使用逗號(hào)分隔,像這樣:

fn main() {
    print_labeled_measurement(5, 'h');
}

fn print_labeled_measurement(value: i32, unit_label: char) {
    println!("The measurement is: {value}{unit_label}");
}

這個(gè)例子創(chuàng)建了一個(gè)名為 print_labeled_measurement 的函數(shù),它有兩個(gè)參數(shù)。第一個(gè)參數(shù)名為 value,類型是 i32。第二個(gè)參數(shù)是 unit_label ,類型是 char。然后,該函數(shù)打印包含 value 和 unit_label 的文本。

嘗試運(yùn)行代碼, 結(jié)果如下:

圖片圖片

因?yàn)槲覀兪褂?nbsp;5 作為 value 的值,h 作為 unit_label 的值來調(diào)用函數(shù),所以程序輸出包含這些值。

3 語句和表達(dá)式

函數(shù)體由一系列的語句和一個(gè)可選的結(jié)尾表達(dá)式構(gòu)成。目前為止,我們提到的函數(shù)還不包含結(jié)尾表達(dá)式,不過已經(jīng)見過作為語句一部分的表達(dá)式。因?yàn)?Rust 是一門基于表達(dá)式(expression-based)的語言,這是一個(gè)需要理解的(不同于其他語言)重要區(qū)別。其他語言并沒有這樣的區(qū)別,所以讓我們看看語句與表達(dá)式有什么區(qū)別以及這些區(qū)別是如何影響函數(shù)體的。

語句(Statements)是執(zhí)行一些操作但不返回值的指令。表達(dá)式(Expressions)計(jì)算并產(chǎn)生一個(gè)值。

實(shí)際上,我們已經(jīng)使用過語句和表達(dá)式。使用 let 關(guān)鍵字創(chuàng)建變量并綁定一個(gè)值是一個(gè)語句。

例如在下面的代碼中, let y = 6;是一個(gè)語句。

fn main() {
    let y = 6;
}

函數(shù)定義也是語句,上面整個(gè)例子本身就是一個(gè)語句。

語句不返回值。因此,不能把 let 語句賦值給另一個(gè)變量,比如下面的例子嘗試做的,會(huì)產(chǎn)生一個(gè)錯(cuò)誤:

fn main() {
    let x = (let y = 6);
}

編譯執(zhí)行后,產(chǎn)生的錯(cuò)誤如下:

圖片圖片

let y = 6 語句并不返回值,所以沒有可以綁定到 x 上的值。這與其他語言不同,例如 C 和 Ruby,它們的賦值語句會(huì)返回所賦的值。在這些語言中,可以這么寫 x = y = 6,這樣 x 和 y 的值都是 6;Rust 中不能這樣寫。

表達(dá)式會(huì)計(jì)算出一個(gè)值,并且你將編寫的大部分 Rust 代碼是由表達(dá)式組成的。

看一下下面的代碼:

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {y}");
}

函數(shù)調(diào)用是一個(gè)表達(dá)式。宏調(diào)用是一個(gè)表達(dá)式。用大括號(hào)創(chuàng)建的一個(gè)新的塊作用域也是一個(gè)表達(dá)式

上面代碼中, 這個(gè)表達(dá)式:

{
    let x = 3;
    x + 1
}

是一個(gè)代碼塊,它的值是 4。這個(gè)值作為 let 語句的一部分被綁定到 y 上。通過調(diào)試代碼, 可以看到語句執(zhí)行情況, 如圖:

圖片圖片

當(dāng)指令執(zhí)行到x+1時(shí),x的值為3, y沒有值, 當(dāng)執(zhí)行完x+1后, 注意觀察x和y的值,如圖:

圖片圖片

注意 x+1 這一行在結(jié)尾沒有分號(hào),與你見過的大部分代碼行不同。表達(dá)式的結(jié)尾沒有分號(hào)。如果在表達(dá)式的結(jié)尾加上分號(hào),它就變成了語句,而語句不會(huì)返回值。在接下來探索具有返回值的函數(shù)和表達(dá)式時(shí)要謹(jǐn)記這一點(diǎn)。

4.具有返回值的函數(shù)

函數(shù)可以向調(diào)用它的代碼返回值??梢圆粚?duì)返回值命名,但要在箭頭(->)后聲明它的類型。在 Rust 中,函數(shù)的返回值等同于函數(shù)體最后一個(gè)表達(dá)式的值。使用 return 關(guān)鍵字和指定值,可從函數(shù)中提前返回;但大部分函數(shù)隱式的返回最后的表達(dá)式。這是一個(gè)有返回值的函數(shù)的例子:

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {x}");
}

在 five 函數(shù)中沒有函數(shù)調(diào)用、宏、甚至沒有 let 語句 —— 只有數(shù)字 5。這在 Rust 中是一個(gè)完全有效的函數(shù)。注意,也指定了函數(shù)返回值的類型,就是 -> i32。嘗試運(yùn)行代碼;輸出如下:

圖片圖片

five 函數(shù)的返回值是 5,所以返回值類型是 i32。仔細(xì)檢查一下這段代碼。有兩個(gè)重要的部分:首先,let x = five(); 這一行表明使用函數(shù)的返回值初始化一個(gè)變量。因?yàn)?nbsp;five 函數(shù)返回 5,這一行與如下代碼相同:

let x = 5;

其次,five 函數(shù)沒有參數(shù)并定義了返回值類型,不過函數(shù)體只有單單一個(gè) 5 也沒有分號(hào),因?yàn)檫@是一個(gè)表達(dá)式,我們想要返回它的值。

看下面的例子:

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {x}");
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

運(yùn)行代碼會(huì)打印出 The value of x is: 6。

但如果在包含 x + 1 的行尾加上一個(gè)分號(hào),把它從表達(dá)式變成語句, 代碼如下:

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {x}");
}

fn plus_one(x: i32) -> i32 {
    x + 1;
}

我們將看到一個(gè)錯(cuò)誤,如圖:

圖片圖片

主要的錯(cuò)誤信息,“mismatched types”(類型不匹配),揭示了代碼的核心問題。函數(shù) plus_one 的定義說明它要返回一個(gè) i32 類型的值,不過語句并不會(huì)返回值,使用單位類型 () 表示不返回值。因?yàn)椴环祷刂蹬c函數(shù)定義相矛盾,從而出現(xiàn)一個(gè)錯(cuò)誤。在輸出中,Rust 提供了一條信息,可能有助于糾正這個(gè)錯(cuò)誤:它建議刪除分號(hào),將會(huì)修復(fù)這個(gè)錯(cuò)誤。

責(zé)任編輯:武曉燕 來源: 二進(jìn)制空間安全
相關(guān)推薦

2024-01-05 17:41:36

Rust編程循環(huán)

2010-11-16 14:53:02

Oracle游標(biāo)表達(dá)式

2012-04-28 15:22:46

PHP

2021-08-07 07:21:26

AndroidKotlinLambda

2009-12-14 09:57:04

Lambda表達(dá)式

2011-05-30 16:11:46

Javascript

2009-09-17 11:08:55

LINQ查詢表達(dá)式

2009-09-15 17:30:00

Linq Lambda

2017-03-31 14:05:26

Linux正則表達(dá)式基礎(chǔ)知識(shí)

2017-05-12 10:47:45

Linux正則表達(dá)式程序基礎(chǔ)

2017-08-01 00:19:15

Javascript函數(shù)函數(shù)聲明

2009-08-31 17:11:37

Lambda表達(dá)式

2018-09-27 15:25:08

正則表達(dá)式前端

2009-06-08 16:49:05

Java正則表達(dá)式group

2014-01-05 17:41:09

PostgreSQL表達(dá)式

2011-07-06 11:04:42

C#正則表達(dá)式

2017-12-27 15:25:50

LinuxBash正則表達(dá)式

2009-08-07 14:31:40

.NET正則表達(dá)式基礎(chǔ)

2024-12-02 10:56:29

2021-06-28 08:01:57

JS 函數(shù)表達(dá)式函數(shù)聲明
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)