国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Rust編程基礎之函數和表達式

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

1.Rust函數

在之前的文章中,我們已經見到了一個函數:main函數, 它是很多程序的入口點。也見過 fn 關鍵字,它用來聲明新函數。

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

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

    another_function();
}

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

我們在 Rust 中通過輸入 fn 后面跟著函數名和一對圓括號來定義函數。大括號告訴編譯器哪里是函數體的開始和結尾。

可以使用函數名后跟圓括號來調用我們定義過的任意函數。因為程序中已定義 another_function 函數,所以可以在 main 函數中調用它。注意,源碼中 another_function 定義在 main 函數 之后;也可以定義在之前。Rust 不關心函數定義所在的位置,只要函數被調用時出現在調用之處可見的作用域內就行。

將上面的代碼編譯執行, 會看到有以下輸出:

圖片圖片

main 函數中的代碼會按順序執行。首先,打印 “Hello, world!” 信息,然后調用 another_function 函數并打印它的信息。

2 函數參數

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

在another_function 中,增加了一個參數:

fn main() {
    another_function(5);
}

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

嘗試運行程序,將會輸出如下內容:

圖片圖片

another_function 的聲明中有一個命名為 x 的參數。x 的類型被指定為 i32。當我們將 5 傳給 another_function 時,println! 宏會把 5 放在格式字符串中包含 x 的那對花括號的位置。

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

當定義多個參數時,使用逗號分隔,像這樣:

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

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

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

嘗試運行代碼, 結果如下:

圖片圖片

因為我們使用 5 作為 value 的值,h 作為 unit_label 的值來調用函數,所以程序輸出包含這些值。

3 語句和表達式

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

語句(Statements)是執行一些操作但不返回值的指令。表達式(Expressions)計算并產生一個值。

實際上,我們已經使用過語句和表達式。使用 let 關鍵字創建變量并綁定一個值是一個語句。

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

fn main() {
    let y = 6;
}

函數定義也是語句,上面整個例子本身就是一個語句。

語句不返回值。因此,不能把 let 語句賦值給另一個變量,比如下面的例子嘗試做的,會產生一個錯誤:

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

編譯執行后,產生的錯誤如下:

圖片圖片

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

表達式會計算出一個值,并且你將編寫的大部分 Rust 代碼是由表達式組成的。

看一下下面的代碼:

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

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

函數調用是一個表達式。宏調用是一個表達式。用大括號創建的一個新的塊作用域也是一個表達式

上面代碼中, 這個表達式:

{
    let x = 3;
    x + 1
}

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

圖片圖片

當指令執行到x+1時,x的值為3, y沒有值, 當執行完x+1后, 注意觀察x和y的值,如圖:

圖片圖片

注意 x+1 這一行在結尾沒有分號,與你見過的大部分代碼行不同。表達式的結尾沒有分號。如果在表達式的結尾加上分號,它就變成了語句,而語句不會返回值。在接下來探索具有返回值的函數和表達式時要謹記這一點。

4.具有返回值的函數

函數可以向調用它的代碼返回值。可以不對返回值命名,但要在箭頭(->)后聲明它的類型。在 Rust 中,函數的返回值等同于函數體最后一個表達式的值。使用 return 關鍵字和指定值,可從函數中提前返回;但大部分函數隱式的返回最后的表達式。這是一個有返回值的函數的例子:

fn five() -> i32 {
    5
}

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

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

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

圖片圖片

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

let x = 5;

其次,five 函數沒有參數并定義了返回值類型,不過函數體只有單單一個 5 也沒有分號,因為這是一個表達式,我們想要返回它的值。

看下面的例子:

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

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

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

運行代碼會打印出 The value of x is: 6。

但如果在包含 x + 1 的行尾加上一個分號,把它從表達式變成語句, 代碼如下:

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

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

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

我們將看到一個錯誤,如圖:

圖片圖片

主要的錯誤信息,“mismatched types”(類型不匹配),揭示了代碼的核心問題。函數 plus_one 的定義說明它要返回一個 i32 類型的值,不過語句并不會返回值,使用單位類型 () 表示不返回值。因為不返回值與函數定義相矛盾,從而出現一個錯誤。在輸出中,Rust 提供了一條信息,可能有助于糾正這個錯誤:它建議刪除分號,將會修復這個錯誤。

責任編輯:武曉燕 來源: 二進制空間安全
相關推薦

2024-01-05 17:41:36

Rust編程循環

2012-04-28 15:22:46

PHP

2010-11-16 14:53:02

Oracle游標表達式

2011-05-30 16:11:46

Javascript

2009-12-14 09:57:04

Lambda表達式

2009-09-17 11:08:55

LINQ查詢表達式

2021-08-07 07:21:26

AndroidKotlinLambda

2017-03-31 14:05:26

Linux正則表達式基礎知識

2009-09-15 17:30:00

Linq Lambda

2017-05-12 10:47:45

Linux正則表達式程序基礎

2017-08-01 00:19:15

Javascript函數函數聲明

2009-08-31 17:11:37

Lambda表達式

2018-09-27 15:25:08

正則表達式前端

2014-01-05 17:41:09

PostgreSQL表達式

2009-06-08 16:49:05

Java正則表達式group

2017-12-27 15:25:50

LinuxBash正則表達式

2021-06-28 08:01:57

JS 函數表達式函數聲明

2011-07-06 11:04:42

C#正則表達式

2010-09-10 15:20:11

SQL函數計算表達式

2020-10-16 06:40:25

C++匿名函數
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品久久久久久女王| 国产精品亚洲激情| 成人一级片网站| 真实国产乱子伦精品一区二区三区| 精品免费一区二区三区| 欧美私人情侣网站| 蜜臀久久99精品久久久久久9 | 日本在线视频网址| 亚洲精品视频在线看| 欧美日韩在线免费观看视频| 国产成人1区| 久久人人爽人人爽人人片亚洲| 天堂中文8资源在线8| 精品久久久久久| www.99av| 成人性生交大片免费看中文| 国产亚洲第一区| 91综合久久一区二区| 海角国产乱辈乱精品视频| 在线一区视频观看| 日韩精品极品在线观看播放免费视频| 日韩在线无毛| 一区二区三区自拍| 日韩毛片在线免费看| 国产精品主播直播| 欧美久久在线| 国产欧美日韩亚洲一区二区三区| 成人写真视频福利网| 国产中文精品久高清在线不| 欧美激情二区三区| 在线播放一区二区精品视频| 久久亚洲精品毛片| 九七电影院97理论片久久tvb| 亚洲精品xxxx| 国产v日韩v欧美v| 亚洲福利视频二区| 日本精品600av| 日韩三级免费观看| 粗大黑人巨茎大战欧美成人| 欧美剧在线免费观看网站| 色网站在线看| 日韩丝袜美女视频| 国产中文在线播放| 亚洲小视频在线| 欧美日韩五区| 爱福利视频一区| 91在线一区| 日产精品久久久一区二区福利| 国产成人手机高清在线观看网站| 国产精品老女人精品视频| 久久精品久久久| 国产精品日韩高清| 男人操女人的视频在线观看欧美 | 欧美成人基地| 欧美在线精品免播放器视频| 香蕉视频一区| 国产精品视频26uuu| 欧美三级网页| 日本一区二区三区视频在线播放| 精品一区二区三区免费视频| 97中文字幕在线| 中文字幕av不卡| 在线国产视频| 日韩精品在线看片z| 51一区二区三区| 2019精品视频| 亚洲成人资源| 欧美日韩福利在线| 国产精品免费aⅴ片在线观看| 久久白虎精品| 欧美丝袜丝nylons| 日韩pacopacomama| 久久精品电影网| 欧美大黑bbbbbbbbb在线| 免费看污久久久| 不卡欧美aaaaa| 一级毛片aaaaaa免费看| 欧美性猛片aaaaaaa做受| 爱搞国产精品| 45www国产精品网站| 99国产精品私拍| 黄色一级片在线看| 亚洲成人免费在线| 91桃色在线观看| 欧美在线性爱视频 | 日韩欧美一区电影| 成人精品在线| 91九色精品视频| 激情综合色丁香一区二区| 亚洲污视频在线观看| 欧美日韩国产高清一区| 国产精久久久| 精品国产一区二区三区免费| 99精品视频在线观看| 午夜成人影视| www欧美日韩| 国内久久视频| 又色又爽又高潮免费视频国产| 色综合色综合色综合色综合色综合 | 国产成人综合美国十次| 欧美人体做爰大胆视频| 国产精品日本一区二区三区在线 | 欧美日本在线一区| 国产一区二区三区精品在线观看| 91精品久久久久久蜜桃| 高清国产一区二区三区| 国产在线观看黄| 欧美黑人巨大精品一区二区| 性欧美videos另类喷潮| **毛片在线网站| 在线亚洲男人天堂| 亚洲久久在线| 色老板在线视频| 一色桃子一区二区| 伊人青青综合网| 手机看片福利日韩| 亚洲精品视频在线观看视频| 久久久国产精品| 91制片厂毛片| 亚洲一区二区久久| 久久字幕精品一区| 午夜视频在线免费| 88xx成人精品| 99精品国产热久久91蜜凸| 青春草视频在线观看| 不卡一区二区三区视频| 亚洲视频你懂的| 日本在线成人| 青青青在线观看视频| 日韩精品影音先锋| 国产视频亚洲| 成人全视频高清免费观看| 国产精品久久久久久搜索| 国产日韩欧美电影| 国产高清亚洲| 国产xxxx振车| 亚洲精品自拍偷拍| 久久精品国产99| 97caopron在线视频| 好看的日韩精品| 午夜精品久久久久久久久久久| www.豆豆成人网.com| 青青青青草视频| 亚洲欧美日韩天堂一区二区| 久久久久国产精品一区三寸| 在线中文资源天堂| 国产精品一区二区三区四区五区| 午夜av电影一区| 欧洲杯什么时候开赛| 福利网址在线| 国产免费观看久久黄| 亚洲国产成人va在线观看天堂| 精品在线网站观看| 日本黄大片一区二区三区| 久久国产精品亚洲| av资源站一区| 亚洲精品一区国产| 四虎最新网站| 国产精品久久久久一区二区| 一区二区三区在线免费| 欧美色图国产精品| 欧美伦理影视网| 国产专区一区二区| 日韩精品中午字幕| 国产成人免费视频一区| 日韩成人一区| 在线观看亚洲色图| 国产精品av免费在线观看| 亚洲一区成人在线| 欧美在线不卡| av在线麻豆| 国产精品国三级国产av| 手机av在线| 青青草av免费在线观看| 777av视频| 51色欧美片视频在线观看| 亚洲欧美激情插 | a视频在线免费看| 久精品国产欧美| 精品福利一区二区三区| 色婷婷国产精品| 一个色综合av| 国产精品五区| 午夜伦理福利在线| 特黄国产免费播放| 国产一区视频在线播放| 亚洲天堂av女优| 日韩欧美一区二区免费| 午夜精品成人在线视频| 另类春色校园亚洲| 在线成人福利| 欧美日韩另类综合| 日韩久久精品电影| 国产色综合久久| 99视频精品视频高清免费| 99reav在线| 最新国产精品久久| 8x拔播拔播x8国产精品| 欧美日韩一本到| 成人性生交大合|