Rust 语言表达式

学习要点:

  • 理解 Rust 语言表达式
  • 掌握 Rust 语言几种常见的表达式

这篇文章我们将学习 Rust 语言表达式语法,即条件判断、循环、函数调用。Rust 与常见的 C 家族语言的一个区别在于 Rust 条件或循环语句也有返回值,这种设计起源于 Lisp 语言。

if 表达式

Rust 语言的条件判断表达式与常见的语言没有区别:

fn main() {
    let n = 5;

    if n < 0 {
        print!("{} is negative", n);
    } else if n > 0 {
        print!("{} is positive", n);
    } else {
        print!("{} is zero", n);
    }
}

值得注意的是 if 后面布尔表达式的值只能是 bool 类型,不能是 0 或者其他的。

Rust 语言的条件表达式还有一个好用的功能,就是能返回值,就好像一个分段函数一样:

fn main() {
    let n = 5;

    let flag = if n < 0 {
       -1
    } else if n > 0 {
        1
    } else {
        0
    };
    println!("{}", flag);
}

注意事项:

  • 如果分支用最后一个语句返回值,末尾不要加分号;如果加了分号,返回值会变成 ()
  • Rust 没有所谓的 :? 三元运算符,因为有更加强大的条件表达式。
  • 判断语句分支返回的值类型要一样,这意味如果一个分支返回值,所有分支都要返回值。

match 表达式

match 表达式与 C 语言家族的 switch 语句类似:

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

💡 解释:

  • _ 代表默认的、其他的,即 default
  • 可以用 | 枚举多个,例如 "ZH" | "CN" =>"China"

match 表达式用于枚举体会非常方便:

enum WebEvent {
    PageLoad,
    PageUnload,
    KeyPress(char),
    Paste(String),
    Click { x: i64, y: i64 },
}

fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("page loaded"),
        WebEvent::PageUnload => println!("page unloaded"),
        WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
        WebEvent::Paste(s) => println!("pasted \"{}\".", s),
        WebEvent::Click { x, y } => {
            println!("clicked at x={}, y={}.", x, y);
        },
    }
}

fn main() {
    let pressed = WebEvent::KeyPress('x');
    let pasted  = WebEvent::Paste(String::from("my text"));
    let click   = WebEvent::Click { x: 20, y: 80 };
    let load    = WebEvent::PageLoad;
    let unload  = WebEvent::PageUnload;

    inspect(pressed);
    inspect(pasted);
    inspect(click);
    inspect(load);
    inspect(unload);
}

这个例子可能有些复杂,从以上例子可以总结如下几点:

  • 枚举体的选项使用 :: 指定;
  • 枚举体有值选项的构造方法:let pressed = WebEvent::KeyPress('x');,空值选项的构造方法:let load = WebEvent::PageLoad;
  • 可以用 match 语句的选项析构枚有值举体。

if let 表达式

if let 表达式是 match 表达式的一种特殊情况:

let optional = Some(7);

match optional {
    Some(i) => {
        println!("value: {:?}", i);
    },
    _ => {
        println!("Get None.");
  },
};

上面的式子可以简写为:

let optional = Some(7);

if let Some(i) = optional {
    println!("value: {:?}", i);
} else {
    println!("Get None.");
}

这样写意义更加明确,可以理解为:如果这样就……,不然就…….。多用于错误处理。

循环表达式

理解了条件表达式后,理解循环表达式就会简单很多,Rust 共有四种循环方式:

while condition {
    block
}

for pattern in collection {
    block
}

loop {
    block
}

while let pattern = expr {
    block
}

请看一个例子:

fn main() {
    let mut optional = Some(0);

    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);
        }
    }
}

❓ 为什么 Rust 语言有了 while true {},还有专门设计 loop {} 语句呢?

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!