日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-03 09:17:33 359觀看
導讀1.Rust函數在之前的文章中,我們已經見到了一個函數:main函數, 它是很多程序的入口點。也見過 fn 關鍵字,它用來聲明新函數。Rust 代碼中的函數和變量名使用 snake case 規范風格。在 snake case 中,所有字母都是小寫并

1.Rust函數

在之前的文章中,我們已經見到了一個函數:main函數, 它是很多程序的入口點。也見過 fn 關鍵字,它用來聲明新函數。aXv28資訊網——每日最新資訊28at.com

Rust 代碼中的函數和變量名使用 snake case 規范風格。在 snake case 中,所有字母都是小寫并使用下劃線分隔單詞。這是一個包含函數定義示例的程序:aXv28資訊網——每日最新資訊28at.com

fn main() {    println!("Hello, world!");    another_function();}fn another_function() {    println!("Another function.");}

我們在 Rust 中通過輸入 fn 后面跟著函數名和一對圓括號來定義函數。大括號告訴編譯器哪里是函數體的開始和結尾。aXv28資訊網——每日最新資訊28at.com

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

將上面的代碼編譯執行, 會看到有以下輸出:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

main 函數中的代碼會按順序執行。首先,打印 “Hello, world!” 信息,然后調用 another_function 函數并打印它的信息。aXv28資訊網——每日最新資訊28at.com

2 函數參數

我們可以定義為擁有 參數(parameters)的函數,參數是特殊變量,是函數簽名的一部分。當函數擁有參數(形參)時,可以為這些參數提供具體的值(實參)。aXv28資訊網——每日最新資訊28at.com

在another_function 中,增加了一個參數:aXv28資訊網——每日最新資訊28at.com

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

嘗試運行程序,將會輸出如下內容:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

another_function 的聲明中有一個命名為 x 的參數。x 的類型被指定為 i32。當我們將 5 傳給 another_function 時,println! 宏會把 5 放在格式字符串中包含 x 的那對花括號的位置。aXv28資訊網——每日最新資訊28at.com

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

當定義多個參數時,使用逗號分隔,像這樣:aXv28資訊網——每日最新資訊28at.com

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 的文本。aXv28資訊網——每日最新資訊28at.com

嘗試運行代碼, 結果如下:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

因為我們使用 5 作為 value 的值,h 作為 unit_label 的值來調用函數,所以程序輸出包含這些值。aXv28資訊網——每日最新資訊28at.com

3 語句和表達式

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

語句(Statements)是執行一些操作但不返回值的指令。表達式(Expressions)計算并產生一個值。aXv28資訊網——每日最新資訊28at.com

實際上,我們已經使用過語句和表達式。使用 let 關鍵字創建變量并綁定一個值是一個語句。aXv28資訊網——每日最新資訊28at.com

例如在下面的代碼中, let y = 6;是一個語句。aXv28資訊網——每日最新資訊28at.com

fn main() {    let y = 6;}

函數定義也是語句,上面整個例子本身就是一個語句。aXv28資訊網——每日最新資訊28at.com

語句不返回值。因此,不能把 let 語句賦值給另一個變量,比如下面的例子嘗試做的,會產生一個錯誤:aXv28資訊網——每日最新資訊28at.com

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

編譯執行后,產生的錯誤如下:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

let y = 6 語句并不返回值,所以沒有可以綁定到 x 上的值。這與其他語言不同,例如 C 和 Ruby,它們的賦值語句會返回所賦的值。在這些語言中,可以這么寫 x = y = 6,這樣 x 和 y 的值都是 6;Rust 中不能這樣寫。aXv28資訊網——每日最新資訊28at.com

表達式會計算出一個值,并且你將編寫的大部分 Rust 代碼是由表達式組成的。aXv28資訊網——每日最新資訊28at.com

看一下下面的代碼:aXv28資訊網——每日最新資訊28at.com

fn main() {    let y = {        let x = 3;        x + 1    };    println!("The value of y is: {y}");}

函數調用是一個表達式。宏調用是一個表達式。用大括號創建的一個新的塊作用域也是一個表達式aXv28資訊網——每日最新資訊28at.com

上面代碼中, 這個表達式:aXv28資訊網——每日最新資訊28at.com

{    let x = 3;    x + 1}

是一個代碼塊,它的值是 4。這個值作為 let 語句的一部分被綁定到 y 上。通過調試代碼, 可以看到語句執行情況, 如圖:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

當指令執行到x+1時,x的值為3, y沒有值, 當執行完x+1后, 注意觀察x和y的值,如圖:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

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

4.具有返回值的函數

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

fn five() -> i32 {    5}fn main() {    let x = five();    println!("The value of x is: {x}");}

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

圖片圖片aXv28資訊網——每日最新資訊28at.com

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

let x = 5;

其次,five 函數沒有參數并定義了返回值類型,不過函數體只有單單一個 5 也沒有分號,因為這是一個表達式,我們想要返回它的值。aXv28資訊網——每日最新資訊28at.com

看下面的例子:aXv28資訊網——每日最新資訊28at.com

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。aXv28資訊網——每日最新資訊28at.com

但如果在包含 x + 1 的行尾加上一個分號,把它從表達式變成語句, 代碼如下:aXv28資訊網——每日最新資訊28at.com

fn main() {    let x = plus_one(5);    println!("The value of x is: {x}");}fn plus_one(x: i32) -> i32 {    x + 1;}

我們將看到一個錯誤,如圖:aXv28資訊網——每日最新資訊28at.com

圖片圖片aXv28資訊網——每日最新資訊28at.com

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

本文鏈接:http://www.www897cc.com/showinfo-26-16759-0.htmlRust編程基礎之函數和表達式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: JavaScript設計模式——創建型設計模式

下一篇: JetBrains聯合谷歌搞事情!首發穩定版Kotlin跨平臺開發框架!

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 娱乐| 平罗县| 合肥市| 西安市| 桐城市| 惠安县| 舒兰市| 石楼县| 延吉市| 宝坻区| 许昌县| 林周县| 扶沟县| 皮山县| 奉化市| 武义县| 云和县| 宜丰县| 壤塘县| 张家界市| 革吉县| 措勤县| 红原县| 米易县| 龙陵县| 汝阳县| 南汇区| 长春市| 拜城县| 新兴县| 长岭县| 迭部县| 南漳县| 翼城县| 武鸣县| 阿图什市| 海盐县| 保康县| 佛冈县| 陵水| 长汀县|