zoukankan      html  css  js  c++  java
  • 控制结构


    If

    If是分支 (branch) 的一种特殊形式,也可以使用elseelse if。 与C语言不同的是,逻辑条件不需要用小括号括起来,但是条件后面必须跟一个代码块。 Rust中的if是一个表达式 (expression),可以赋给一个变量:

    let x = 5;
    
    let y = if x == 5 { 10 } else { 15 };

    Rust是基于表达式的编程语言,有且仅有两种语句 (statement):

    1. 声明语句 (declaration statement),比如进行变量绑定的let语句。
    2. 表达式语句 (expression statement),它通过在末尾加上分号;来将表达式变成语句, 丢弃该表达式的值,一律返回元类型()

    表示式总是返回一个值,但是语句不返回值或者返回(),所以以下代码会报错:

    let y = (let x = 5);
    
    let z: i32 = if x == 5 { 10; } else { 15; };

    值得注意的是,在Rust中赋值 (如x = 5) 也是一个表达式,返回元类型值()

    For

    Rust中的for循环与C语言的风格非常不同,抽象结构如下:

    for var in expression {
        code
    }

    其中expression是一个迭代器 (iterator),具体的例子为0..10 (不包含最后一个值), 或者[0, 1, 2].iter()

    While

    Rust中的while循环与C语言中的类似。对于无限循环,Rust有一个专用的关键字loop。 如果需要提前退出循环,可以使用关键字break或者continue, 还允许在循环的开头设定标签 (同样适用于for循环):

    Match

    Rust中的match表达式非常强大,首先看一个例子:

    let day = 5;
    
    match day {
      0 | 6 => println!("weekend"),
      1 ... 5 => println!("weekday"),
      _ => println!("invalid"),
    }

    其中|用于匹配多个值,...匹配一个范围 (包含最后一个值),并且_在这里是必须的, 因为match强制进行穷尽性检查 (exhaustiveness checking),必须覆盖所有的可能值。 如果需要得到|或者...匹配到的值,可以使用@绑定变量:

    let x = 1;
    
    match x {
        e @ 1 ... 5 => println!("got a range element {}", e),
        _ => println!("anything"),
    }

    使用ref关键字来得到一个引用:

    let x = 5;
    let mut y = 5;
    
    match x {
        // the `r` inside the match has the type `&i32`
        ref r => println!("Got a reference to {}", r),
    }
    
    match y {
        // the `mr` inside the match has the type `&i32` and is mutable
        ref mut mr => println!("Got a mutable reference to {}", mr),
    }

    再看一个使用match表达式来解构元组的例子:

    let pair = (0, -2);
    
    match pair {
        (0, y) => println!("x is `0` and `y` is `{:?}`", y),
        (x, 0) => println!("`x` is `{:?}` and y is `0`", x),
        _ => println!("It doesn't matter what they are"),
    }

    match的这种解构同样适用于结构体或者枚举。如果有必要, 还可以使用..来忽略域或者数据:

    struct Point {
        x: i32,
        y: i32,
    }
    
    let origin = Point { x: 0, y: 0 };
    
    match origin {
        Point { x, .. } => println!("x is {}", x),
    }
    
    enum OptionalInt {
        Value(i32),
        Missing,
    }
    
    let x = OptionalInt::Value(5);
    
    match x {
        OptionalInt::Value(i) if i > 5 => println!("Got an int bigger than five!"),
        OptionalInt::Value(..) => println!("Got an int!"),
        OptionalInt::Missing => println!("No such luck."),
    }

    此外,Rust还引入了if letwhile let进行模式匹配:

    let number = Some(7);
    let mut optional = Some(0);
    
    // If `let` destructures `number` into `Some(i)`, evaluate the block.
    if let Some(i) = number {
        println!("Matched {:?}!", i);
    } else {
        println!("Didn't match a number!");
    }
    
    // While `let` destructures `optional` into `Some(i)`, evaluate the block.
    while let Some(i) = optional {
        if i > 9 {
            println!("Greater than 9, quit!");
            optional = None;
        } else {
            println!("`i` is `{:?}`. Try again.", i);
            optional = Some(i + 1);
        }
    }
    'outer: loop {
       println!("Entered the outer loop");
    
       'inner: loop {
           println!("Entered the inner loop");
           break 'outer;
       }
    
       println!("This point will never be reached");
    }
    
    println!("Exited the outer loop");
  • 相关阅读:
    如何通过cocosStudio将plist大图拆分成原来的小图
    斯坦福大学深度学习视频(CS231n课程)
    杂谈——杭州考驾照历程
    机器学习基础自学笔记2
    深度学习笔记1
    GAN学习指南:从原理入门到制作生成Demo
    GAN实现半监督学习
    无监督深度学习图像分类思路
    无监督学习:从基本概念到四种实现模型
    深度学习-无监督
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7603598112ab8db83b0b93cdfaded4b7.html
Copyright © 2011-2022 走看看