AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

1.Rust函數

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

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

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

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

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

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

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

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

2 函數參數

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

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

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

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

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

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

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

當定義多個參數時,使用逗號分隔,像這樣:K8q28資訊網——每日最新資訊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 的文本。K8q28資訊網——每日最新資訊28at.com

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

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

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

3 語句和表達式

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

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

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

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

fn main() {    let y = 6;}

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

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

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

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

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

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

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

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

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

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

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

{    let x = 3;    x + 1}

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

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

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

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

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

4.具有返回值的函數

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

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

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

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

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

let x = 5;

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

看下面的例子:K8q28資訊網——每日最新資訊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。K8q28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從“最美JK”起到“最美女星&r
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 攜眾多高端產品亮相ChinaJoy,小米帶來一場科技與人文的視聽盛宴

    7月28日,全球數字娛樂領域最具知名度與影響力的年度盛會中國國際數碼互動娛樂展覽會(簡稱ChinaJoy)在上海新國際博覽中心盛大開幕。作為全球領先的科
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top