最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

rust流程控制的具體使用

 更新時間:2023年12月07日 11:49:46   作者:int8  
在Rust中,控制流包括條件語句、循環(huán)和匹配模式等,用于實現程序的邏輯和流程控制,本文就來詳細的介紹一下,感興趣的可以了解一下

一、分支

(一)if

1.if
語法格式

if boolean_expression {
}

例子

fn main(){
     let num:i32 = 5;
     if num > 0 {
         println!("正數");
     }
}

條件表達式不需要用小括號。
條件表達式必須是bool類型。

2.if else

語法格式

if boolean_expression {
} else {
}

例子

fn main() {
     let num = 12;
     if num % 2==0 {
         println!("偶數");
     } else {
         println!("奇數");
     }
}

if else既可以作語句,又可以作表達式。當作表達式時,它的值是其分支代碼塊最后一個表達式的值。
我們可以在 let 語句的右側使用它,例如:

fn main() {
     let condition = true;
     let number = if condition { 5 } else { 6 };
     println!("The value of number is: {number}");
}

值取決于哪個代碼塊被執(zhí)行。這意味著 if 的每個分支的可能的返回值都必須是相同類型;
在上例中,if 分支和 else 分支的結果都是 i32 整型。如果它們的類型不匹配,如下面這個例子,則會出現一個錯誤:

fn main() {
     let condition = true;
     let number = if condition { 5 } else { "six" };
     println!("The value of number is: {number}");
}

3.if else if

語法格式

if boolean_expression1 {
} else if boolean_expression2 {
} else {
}

例子

fn main() {
     let num = 2 ;
     if num > 0 {
          println!("{} is positive",num);
     } else if num < 0 {
         println!("{} is negative",num);
     } else {
         println!("{} is neither positive nor negative",num) ;
     }
}

(二)if let

句法

IfLetExpression :
if let Pattern = Expression BlockExpression
(else ( BlockExpression | IfExpression | IfLetExpression ) )?

1.if let

語法格式

if let Pattern = Expression {
}

Pattern就是模式。
如果Pattern與Expression匹配,就執(zhí)行相應的代碼塊。
可以使用操作符 | 指定多個模式。 這與match表達式中的 | 具有相同的語義

例子

enum E {
     X(u8),
     Y(u8),
     Z(u8),
}
let v = E::Y(12);
if let E::X(n) | E::Y(n) = v {
     assert_eq!(n, 12);
}

2.if let else

語法格式

if let Pattern = Expression {
} else {
}

例子

let dish = ("Ham", "Eggs");
if let ("Bacon", b) = dish {
     println!("Bacon is served with {}", b);
} else {
     println!("No bacon will be served");
}

if let else與if else一樣既可以作語句,又可以作表達式。當作表達式時,它的值是其分支代碼塊最后一個表達式的值。

fn main() {
    let x = Some(3);
    let a = if let Some(1) = x { 1 } else { 5 };
    println!("{a}");
}

3.if let else if let
語法格式

if let Pattern1 = Expression1 {
} else if let Pattern2 = Expression2 {
}else {
}

4.if和if let混合使用
語法格式

if let Pattern = Expression {
} else if boolean_expression{
}else {
}

例子

let x = Some(3);
let a = if let Some(1) = x {
     1
} else if x == Some(2) {
     2
} else if let Some(y) = x {
     y
} else {
     -1
};
assert_eq!(a, 3);

5.if let等價于match
例如:

if let PATS = EXPR {
     /* body */
} else {
     /*else */
}
等價于
match EXPR {
     PATS => { /* body */ },
     _ => { /* else */ }, // 如果沒有else塊,這相當于 `()`
}

在一些場合下,用match并不優(yōu)雅,因為match必須考慮所有可能的值。
比如:

let optional = Some(7);
match optional {
     Some(i) => {
         println!("This is a really long string and `{:?}`", i);
     },
     _ => {},     // 必須有,因為 `match` 需要覆蓋全部情況。不覺得這行很多余嗎?
};

if let在這樣的場合要簡潔得多

fn main() {
     let number = Some(7);

     if let Some(i) = number {
         println!("Matched {:?}!", i);
     }
}

另一個好處是:if let允許匹配枚舉非參數化的變量,即枚舉未注明 #[derive(PartialEq)],我們也沒有為其實現PartialEq。在這種情況下,通常if Foo::Bar==a會出錯,因為此類枚舉的實例不具有可比性。但是,if let是可行的。
你想挑戰(zhàn)一下嗎?使用if let修復以下示例:

// 該枚舉故意未注明 `#[derive(PartialEq)]`,
// 并且也沒為其實現 `PartialEq`。這就是為什么下面比較 `Foo::Bar==a` 會失敗的原因。
enum Foo {Bar}

fn main() {
     let a = Foo::Bar;

     // 變量匹配Foo::Bar
     if Foo::Bar == a {
         // ^-- 這就是編譯時發(fā)現的錯誤。使用 `if let` 來替換它。
         println!("a is foobar");
     }
}

(三)match

match用于檢查值是否匹配一組模式中的某一個。似于C語言中的 switch 語句

語法格式

match variable_expression {
     pattern1 => {
     },
     pattern2 => {
         // 
     },
     _ => {
         // 默認
     }
};

例子

fn main() {
     let x = 1;
     match x {
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        4 => println!("four"),
        5 => println!("five"),
        _ => println!("something else"),
     }
}

match既可以作語句,也可以作表達式,作表達式時,它把匹配分支代碼塊的最后一條表達式的結果當作返回值。
例子

fn main(){
    let state_code = "MH";
     let state = match state_code {
         "MH" => "Maharashtra",
         "KL" => "Kerala",
         "KA" => "Karnadaka",
         "GA" => "Goa",
         _ => "Unknown"
     };
     println!("State name is {}",state);
}
運行結果
State name is Maharashtra

模式守衛(wèi)
守衛(wèi)出現在模式的后面,由關鍵字if后面的布爾類型表達式組成。
當模式匹配成功時,將執(zhí)行守衛(wèi)表達式。 只有此表達式的計算結果為真,才認為完全匹配成功。 否則,匹配將測試下一個模式,包括測試同一分支中運算符 | 分割的后續(xù)模式。

fn main() {
    let maybe_digit = Some(8);
    match maybe_digit {
         Some(x) if x < 10 => println!("digit < 10"),
         Some(x) => println!("digit >= 10"),
         None => panic!(),
    };
}

注意:使用操作符 | 的分支可能會導致后跟的守衛(wèi)必須多次執(zhí)行的副作用。 例如:

use std::cell::Cell;
let i = Cell::new(0i32);
match 1 {
     1 | _ if { i.set(i.get() + 1); false } => {}
     _ => {}
}
assert_eq!(i.get(), 2);

二、循環(huán)

(一)for

Rust 中的 for 只有 for in 這種格式,常用于遍歷容器的元素
句法

IteratorLoopExpression :
for Pattern in Expression BlockExpression

pattern就是模式

例子
下面的代碼,使用 for…in 循環(huán),重復輸出1到11之間的數字(不包括11)

fn main(){
     for x in 1..11{
         println!("x is {}",x);
     }
}
fn main() {
     let a = [10, 20, 30, 40, 50];
     for element in a {
         println!("the value is: {element}");
     }
}

(二)while

句法

PredicateLoopExpression :
while Expression BlockExpression

例子
下面的代碼,使用 while 循環(huán)重寫下上面的代碼,重復輸出1到11之間的數字(不包括11)

fn main(){
     let mut x = 1;
     while x < 11{
         println!("inside loop x value is {}",x);
         x+=1;
     }
     println!("outside loop x value is {}",x);
}

(三)loop

loop 語句代表著一種死循環(huán)。
語法格式

loop {
}

范例
下面的語句,我們使用 loop 輸出1到無限大的數字。

fn main(){
     let mut x = 0;
     loop {
         x+=1;
         println!("x={}",x);
     }
}

(四)while let

句法

PredicatePatternLoopExpression :
while let Pattern = Expression BlockExpression

Pattern就是模式
如果值與模式匹配,則執(zhí)行循環(huán)體塊。如果不匹配,則跳出循環(huán)。

可以使用操作符 | 指定多個模式。

let mut vals = vec![2, 3, 1, 2, 2];
while let Some(v @ 1) | Some(v @ 2) = vals.pop() {
     // 打印2, 2, 然后1
     println!("{}", v);
}

例子

let mut x = vec![1, 2, 3];
while let Some(y) = x.pop() {
     println!("y = {}", y);
}
while let _ = 5 {
     println!("不可反駁模式總是會匹配成功");
     break;
}

while let等價于包含match的loop。
如下:

while let PATS = EXPR {
     /* loop body */
}
等價于
loop {
     match EXPR {
         PATS => { /* loop body */ },
         _ => break,
     }
}

三、循環(huán)標簽

句法

LoopLabel :
LIFETIME_OR_LABEL :

一個循環(huán)表達式可以選擇設置一個標簽。這類標簽被標記為循環(huán)表達式之前的生存期(標簽),如 'foo: loop { break 'foo; }、'bar: while false {}、'humbug: for _ in 0…0 {}。 如果循環(huán)存在標簽,則嵌套在該循環(huán)中的帶此標簽的break表達式和continue表達式可以退出此標簽標記的循環(huán)層或將控制流返回至此標簽標記的循環(huán)層的頭部。

四、跳出循環(huán)

(一)break

句法

BreakExpression :
break LIFETIME_OR_LABEL? Expression?

當遇到break時,相關的循環(huán)體的執(zhí)行將立即結束,例如:

let mut last = 0;
for x in 1..100 {
     if x > 12 {
         break;
     }
     last = x;
}
assert_eq!(last, 12);

break表達式只能跳出一層循環(huán),如果要跳出多層循環(huán),就要使用循環(huán)標簽。
例如:

'outer: loop {
     while true {
         break 'outer;
     }
}

break表達式只允許在循環(huán)體內使用,它有break、break 'label、break EXPR、break 'label EXPR這四種形式。

fn main(){
     let mut x = 0;
     loop {
         x+=1;
         if x > 10 {
              break;
         }
         println!("x={}",x);
     }
}

break 可以返回值
當使用loop循環(huán)時,可以使用break表達式從循環(huán)中返回一個值,通過形如break EXPR或break 'label EXPR來返回,其中EXPR是一個表達式。
其后不跟表達式的break與后跟 () 的break效果相同。
例如:

let (mut a, mut b) = (1, 1);
let result = loop {
     if b > 10 {
         break b;
     }
     let c = a + b;
     a = b;
     b = c;
};
// 斐波那契數列中第一個大于10的值:
assert_eq!(result, 13);

(二)continue

句法

ContinueExpression :
continue LIFETIME_OR_LABEL?

當遇到continue時,相關的循環(huán)體的當前迭代將立即結束,并將控制流返回到循環(huán)頭。 在while循環(huán)的情況下,循環(huán)頭是控制循環(huán)的條件表達式。 在for循環(huán)的情況下,循環(huán)頭是控制循環(huán)的調用表達式。
與break一樣,continue只能跳過一層循環(huán),如果要跳過多層,可以使用continue 'label。
continue表達式只允許在循環(huán)體內部使用。

fn main(){
     for x in 1..11{
         if 5 == x {
             continue;
         }
         println!("x is {}",x);
     }
}

到此這篇關于rust流程控制的具體使用的文章就介紹到這了,更多相關rust流程控制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Rust?duckdb和polars讀csv文件比較情況

    Rust?duckdb和polars讀csv文件比較情況

    duckdb在數據分析上,有非常多不錯的特質,1、快;2、客戶體驗好,特別是可以同時批量讀csv在一個目錄下的csv等文件,今天來比較下Rust?duckdb和polars讀csv文件比較的情況,感興趣的朋友一起看看吧
    2024-06-06
  • 一文學會Rust語言如何操作JSON

    一文學會Rust語言如何操作JSON

    JSON在Web開發(fā)中被廣泛應用于數據交換,本文主要介紹了Rust語言操作JSON,包括序列化、反序列化、JSON創(chuàng)建等多個方面,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust實現一個表達式Parser小結

    Rust實現一個表達式Parser小結

    這篇文章主要為大家介紹了Rust實現一個表達式Parser小結,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 利用Rust編寫一個簡單的字符串時鐘

    利用Rust編寫一個簡單的字符串時鐘

    這篇文章主要為大家詳細介紹了一個用rust寫的一個簡單的練手的demo,一個字符串時鐘,在終端用字符串方式顯示當前時間,感興趣的小伙伴可以了解一下
    2022-12-12
  • 使用systemd部署r-nacos的操作方法

    使用systemd部署r-nacos的操作方法

    r-nacos是一個用rust實現的nacos服務,我們用它平替java?nacos以降低服務占用內存,提升服務的穩(wěn)定性,這篇文章主要介紹了使用systemd部署r-nacos,需要的朋友可以參考下
    2024-03-03
  • 使用環(huán)境變量實現Rust程序中的不區(qū)分大小寫搜索方式

    使用環(huán)境變量實現Rust程序中的不區(qū)分大小寫搜索方式

    本文介紹了如何在Rust中實現不區(qū)分大小寫的搜索功能,并通過測試驅動開發(fā)(TDD)方法逐步實現該功能,通過修改運行函數和獲取環(huán)境變量,程序可以根據環(huán)境變量控制搜索模式
    2025-02-02
  • Rust自定義安裝路徑的詳細圖文教程

    Rust自定義安裝路徑的詳細圖文教程

    工欲善其事必先利其器,無論是對小白還是大神來說,想要學習 Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關于Rust自定義安裝路徑的詳細圖文教程,需要的朋友可以參考下
    2023-03-03
  • Rust錯誤處理之`foo(...)?`的用法與錯誤類型轉換小結

    Rust錯誤處理之`foo(...)?`的用法與錯誤類型轉換小結

    foo(...)?語法糖為Rust的錯誤處理提供了極大的便利,通過結合map_err方法和From?trait的實現,你可以輕松地處理不同類型的錯誤,并保持代碼的簡潔性和可讀性,這篇文章主要介紹了Rust錯誤處理:`foo(...)?`的用法與錯誤類型轉換,需要的朋友可以參考下
    2024-05-05
  • Rust開發(fā)WebAssembly在Html和Vue中的應用小結(推薦)

    Rust開發(fā)WebAssembly在Html和Vue中的應用小結(推薦)

    這篇文章主要介紹了Rust開發(fā)WebAssembly在Html和Vue中的應用,本文將帶領大家在普通html上和vue手腳架上都來運行wasm的流程,需要的朋友可以參考下
    2022-08-08
  • 使用Rust制作康威生命游戲的實現代碼

    使用Rust制作康威生命游戲的實現代碼

    這篇文章主要介紹了使用Rust制作康威生命游戲,初始rust項目,使用wasm的項目模板,結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

阿拉善右旗| 德阳市| 三亚市| 栾川县| 湖州市| 吉首市| 改则县| 台北市| 深州市| 昌平区| 大田县| 固始县| 丰顺县| 安仁县| 怀宁县| 灌云县| 渭南市| 景洪市| 湄潭县| 罗定市| 三门县| 辽源市| 开远市| 泸溪县| 论坛| 车险| 卢氏县| 峨山| 连城县| 保德县| 若尔盖县| 桃江县| 安多县| 扶绥县| 宜君县| 杭州市| 英山县| 子长县| 长白| 瑞金市| 新丰县|