[Rust 入门] Rust 表达式

本教程环境:

系统:MacOS

Rust 版本:1.77.2

Rust 中表达式是构成程序的基础块,能够计算值、执行操作并确定控制流程。

表达式和语句

表达式总是计算并返回一个值,可以将其结果赋值给一个变量,或用作其他变量的一部分。

  • 示例:5+6call_function(){ a + b }

语句执行一些操作,但是不返回任何值。有两种基本的用法:

  • 声明变量:let x = 5;
  • 表达式语句:表达式跟分号,例如some_function();

在 Rust 中每个 {} 块都是一个表达式,可以包含多个语句,最后{}表达式为这个块返回值。{} 的最后一行没有 ;,就返回最后一行表达式的结果作为块的返回;否则,返回 ()

常见表达式

rust 复制代码
#[allow(unused_variables)]
#[allow(dead_code)]
#[allow(unused_assignments)]
// #[alloc()]
fn main() {
    // 常用表达式示例
    // 一些字面量:可以直接表达一个特定的值
    let integer = 42;
    let character = 'a';
    let boolean = true;
    let unit = ();

    // 常量声明
    const MAX_POINTS: u32 = 100_000;

    // 变量绑定
    let x = 10;
    let mut y = 20;
    y += 5;
}

函数表达式

Rust 中函数使用 fn 关键字声明。例如程序的入口就是 main() 函数。 在 Rust 中函数和变量名使用 cnake_case 规范进行命令。例如 get_name()。 函数的定义:

rust 复制代码
// 无参,返回值为 ()
fn main() {}

// 有参数,返回值为 ()
fn print_name(name: &str) {
    println!("hello {}", name);
}

// i32 类型参数,返回值为 i32 类型
fn add_one(n: i32) -> i32 {
    n + 1
}
  • 多个参数使用逗号分隔;
  • 每个参数都要显示的指定类型;
  • -> 后声明返回值类型;
  • 如果没有声明返回值,返回 ()
  • 函数最后一行使用表达式,那么函数的返回值就是这个表达式的值。

运算符

在 Rust 中运算符与其操作数一起构成了表达式。常用的运算符:

  • 算术运算符: + - * /(除) %(求模)
  • 比较运算符: == != > >= < <=
  • 逻辑运算符&& || !
  • 类型转换as
  • 位运算符& ^(异或) ! << >>

复合表达式

符合表达式就是将多个操作语句组合成更复杂的逻辑。

块表达式

rust 复制代码
let y = {
    let x = 1;
    x + 1
};

分支表达式(if/else)

rust 复制代码
if condition1 {
	block1
} else if condition2 {
	block2
} else {
	block_n
}

在 Rust 中 if 可以作为表达式来返回值。

rust 复制代码
let number = 7;
let result = if number < 5 {
    "less"
} else {
    "more"
};

循环表达式 - loop、while、for

loop循环会无限重复执行循环体,直到显示的调用 break 退出循环。 while循环会在给定条件为真时执行循环体,并且每次执行前都会检查这个条件。 for循环是通过迭代器来便利集合中的元素。

rust 复制代码
// loop 循环
let mut num = 10;
// loop 可以返回值
let result = loop {
    num -= 1;
    if num == 0 {
        break "num == 0";
    }
};
// 多个loop循环嵌套,可添加标签
let mut count = 0;
'outer: loop {
    println!("外层循环: {}", count);
    count += 1;
    let mut inner_count = 0;
    'inner: loop {
        println!("内层循环: {}", inner_count);
        inner_count += 1;
        if inner_count == 3 {
            // break 'inner;
            continue 'outer;
        }
        if count == 2 {
            break 'outer;
        }
    }
}

// for 
for elem in [10, 20, 30].iter() {
   println!("{}", elem);
}

匹配表达式 - match

类似于其他语言的 switch,允许根据表达式的值进行多个模式的匹配。

rust 复制代码
let value = 'c';
let description = match value {
   'a'..='z' | 'A'..='Z' => "it's a letter",
   '0'..='9' => "it's a digit",
   _ => "something else",
};

return 表达式

return 表达式会退出当前函数,并返回一个值。 不带值的 return;return (); 的简写。 函数不必有明确的 return 表达式,如果最后的表达式没有分号,那么它的值就是函数的返回值。这种方式是 rust 中函数返回值的首选方式。 与 break 表达式一样,return 可以放弃进行中的工作。例如:

rust 复制代码
let output = File::create(filename)?;

这是 match 表达式的简写:

rust 复制代码
let output = match File::create(filename) {
	Ok(f) => f,
	Err(err) => return Err(err)
};

此时如果 File::create() 返回的是一个错误,那么就会执行 return 语句,函数返回一个错误。

特殊类型 !

不能正常结束的表达式属于一个特殊类型 !,不受"类型必须匹配"这条规则的约束。

rust 复制代码
fn exit(code: i32) -> ! {
	loop {
		...
	}
}

! 表示 exit() 函数永远不会返回,它是一个发散函数。

函数与方法调用

rust 复制代码
let x = gcd(1302, 462); // 函数调用
let room = player.location(); // 方法调用
let mut numbers = Vec::new(); // 调用类型关联函数

Rust 在函数调用或方法调用中,泛型类型的常用语法 Vec<T> 是不起作用的,需要使用 ::<...> 比目鱼语法。

rust 复制代码
return Vec::<i32>with_capacity(1000);

let ramp = (0..n).collect::<Vec<i32>>();

引用运算符

&用来表示引用,* 运算符用来访问引用所指向的值。 例如 &u64 类型的变量 elem,那么 *elem 的类型为 u64

闭包表达式

rust 复制代码
let is_even = |x| x % 2 == 0;

本教程代码仓库:github.com/zcfsmile/Ru...

参考链接:

🌟🌟 🙏🙏感谢您的阅读,如果对你有帮助,欢迎关注、点赞 🌟🌟

相关推荐
姜学迁10 小时前
Rust-枚举
开发语言·后端·rust
凌云行者10 小时前
rust的迭代器方法——collect
开发语言·rust
QMCY_jason17 小时前
Ubuntu 安装RUST
linux·ubuntu·rust
碳苯21 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
zaim11 天前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
凌云行者1 天前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
cyz1410011 天前
vue3+vite@4+ts+elementplus创建项目详解
开发语言·后端·rust
超人不怕冷2 天前
[rust]多线程通信之通道
rust
逢生博客2 天前
Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)
开发语言·后端·嵌入式硬件·rust
Maer092 天前
WSL (Linux)配置 Rust 开发调试环境
linux·运维·rust