深入理解Rust语句和表达式

文章目录


  团队博客: 汽车电子社区


一、概述

cpp 复制代码
fn add_with_extra(x: i32, y: i32) -> i32 {
    let x = x + 1;     // 语句
    let y = y + 5;     // 语句
    x + y              // 表达式
}

  语句会执行一些操作但是不会返回一个值,而表达式会在求值后返回一个值,因此在上述函数体的三行代码中,前两行是语句,最后一行是表达式。

二、语句

cpp 复制代码
let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);

  以上都是语句,它们完成了一个具体的操作,但是并没有返回值,因此是语句。

  由于 let 是语句,因此不能将 let 语句赋值给其它值,如下形式是错误的:

cpp 复制代码
let b = (let a = 8);

三、表达式

  表达式会进行求值,然后返回一个值。例如 5 + 6,在求值后,返回值 11,因此它就是一条表达式。

  表达式可以成为语句的一部分,例如 let y = 6 中,6 就是一个表达式,它在求值后返回一个值 6(有些反直觉,但是确实是表达式)。

  调用一个函数是表达式,因为会返回一个值,调用宏也是表达式,用花括号包裹最终返回一个值的语句块也是表达式,总之,能返回值,它就是表达式:

cpp 复制代码
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

  上面使用一个语句块表达式将值赋给 y 变量,语句块长这样:

cpp 复制代码
{
    let x = 3;
    x + 1
}

  该语句块是表达式的原因是:它的最后一行是表达式,返回了 x + 1 的值,注意 x + 1 不能以分号结尾,否则就会从表达式变成语句, 表达式不能包含分号。这一点非常重要,一旦你在表达式后加上分号,它就会变成一条语句,再也不会返回一个值,请牢记!

  最后,表达式如果不返回任何值,会隐式地返回一个 () 。

cpp 复制代码
fn main() {
    assert_eq!(ret_unit_type(), ())
}

fn ret_unit_type() {
    let x = 1;
    // if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
    // 类似三元运算符,在Rust里我们可以这样写
    let y = if x % 2 == 1 {
        "odd"
    } else {
        "even"
    };
    // 或者写成一行
    let z = if x % 2 == 1 { "odd" } else { "even" };
}
相关推荐
techdashen25 分钟前
Go设计取舍之四: map不变时能否并发修改不同value
开发语言·后端·golang
小小小米粒33 分钟前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己34 分钟前
Java 版本演进
java·开发语言·spring boot
风样滴男人哟38 分钟前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
看昭奚恤哭1 小时前
Flutter 布局核心思想
开发语言·javascript·flutter
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
用户608186527901 小时前
一文吃透 Avalonia 布局容器|Grid 到 UniformGrid 核心用法 + 语法糖实战
后端
IsSh9nj6q1 小时前
Python全栈应用搭建神器magic-dash .新版本介绍
开发语言·python·dash
Ai拆代码的曹操2 小时前
Dubbo 线程池爆满排坑:Linux 用户线程数限制,一个容易被忽略的根因
后端·源码阅读
NutShell Wang2 小时前
Vite 8.1 深度拆解:Rolldown 统一打包器如何终结前端构建的「双引擎时代」
前端·rust·开源·vite·开发者工具·vibe coding