Booleans (bool
)
| let is_morning = true; |
| if is_morning { |
| println!("Good morning!"); |
| } |
Characters (char
)
| fn main() { |
| let c1 = 'a'; |
| let c2 = '中'; |
| let c3 = '😊'; |
| println!("c1: {}, c2: {}, c3: {}", c1, c2, c3); |
| } |
Rust 中的 char
Rust 的 char
类型表示一个 Unicode 标量值,占用 4 字节(32 位)。它能够表示来自 Unicode 集合的任意字符(包括 ASCII 字符和非 ASCII 字符)。
- 范围:
U+0000
到 U+D7FF
和 U+E000
到 U+10FFFF
。
- 特点:支持多语言字符(中文、阿拉伯文、表情符号等)。
char
的常用方法
Rust 的 char
类型提供了一些内置方法,用于检查字符的属性或进行转换。以下是主要方法的分类及其用法:
1. 检查字符属性
方法 |
功能 |
示例 |
.is_alphabetic() |
判断是否为字母 |
'a'.is_alphabetic() -> true |
.is_numeric() |
判断是否为数字 |
'5'.is_numeric() -> true |
.is_alphanumeric() |
判断是否为字母或数字 |
'a'.is_alphanumeric() -> true |
.is_ascii() |
判断是否为 ASCII 字符 |
'A'.is_ascii() -> true |
.is_ascii_digit() |
判断是否为 ASCII 数字 |
'5'.is_ascii_digit() -> true |
.is_ascii_alphabetic() |
判断是否为 ASCII 字母 |
'z'.is_ascii_alphabetic() -> true |
.is_ascii_uppercase() |
判断是否为 ASCII 大写字母 |
'Z'.is_ascii_uppercase() -> true |
.is_ascii_lowercase() |
判断是否为 ASCII 小写字母 |
'a'.is_ascii_lowercase() -> true |
.is_control() |
判断是否为控制字符(如换行、回车) |
'\n'.is_control() -> true |
.is_whitespace() |
判断是否为空白字符 |
' '.is_whitespace() -> true |
.is_uppercase() |
判断是否为大写字母 |
'A'.is_uppercase() -> true |
.is_lowercase() |
判断是否为小写字母 |
'a'.is_lowercase() -> true |
.is_ascii_punctuation() |
判断是否为 ASCII 标点符号 |
'.'.is_ascii_punctuation() -> true |
2. 转换字符
方法 |
功能 |
示例 |
.to_ascii_uppercase() |
转换为大写 ASCII 字符 |
'a'.to_ascii_uppercase() -> 'A' |
.to_ascii_lowercase() |
转换为小写 ASCII 字符 |
'A'.to_ascii_lowercase() -> 'a' |
.to_uppercase() |
转换为大写(支持 Unicode) |
'ß'.to_uppercase().collect::<String>() -> "SS" |
.to_lowercase() |
转换为小写(支持 Unicode) |
'A'.to_lowercase().collect::<String>() -> "a" |
3. ASCII 检查
这些方法针对 ASCII 范围(0x00–0x7F)的字符:
| fn main() { |
| let c = '7'; |
| println!("Is ASCII? {}", c.is_ascii()); |
| println!("Is ASCII digit? {}", c.is_ascii_digit()); |
| println!("Is ASCII alphabetic? {}", c.is_ascii_alphabetic()); |
| } |
输出:
| Is ASCII? true |
| Is ASCII digit? true |
| Is ASCII alphabetic? false |
4. 转换为数字或 Unicode 值
方法 |
功能 |
示例 |
.to_digit(radix) |
将字符转换为指定进制的数字 |
'A'.to_digit(16) -> Some(10) |
as u32 |
获取字符的 Unicode 标量值 |
'A' as u32 -> 65 |
array
数组是 Rust 中一种固定大小的集合类型,存储相同类型的元素。数组的大小在编译时固定,元素类型和长度都是数组类型的一部分。
数组的声明与初始化
1. 声明数组
数组的类型为 [T; N]
,其中:
T
是数组中元素的类型。
N
是数组的长度(必须是常量)。
| fn main() { |
| let array1: [i32; 4] = [1, 2, 3, 4]; |
| let array2 = [5, 6, 7, 8]; |
| |
| println!("Array 1: {:?}", array1); |
| println!("Array 2: {:?}", array2); |
| } |
2. 创建重复元素的数组
使用 [value; size]
语法创建一个包含重复元素的数组:
| fn main() { |
| let array = [0; 5]; |
| println!("{:?}", array); |
| } |
数组的访问与操作
1. 通过索引访问元素
索引从 0
开始:
| fn main() { |
| let arr = [10, 20, 30, 40, 50]; |
| println!("First element: {}", arr[0]); |
| println!("Last element: {}", arr[4]); |
| } |
2. 防止索引越界
Rust 会在运行时检查数组索引是否越界,若越界会导致程序 panic
:
| fn main() { |
| let arr = [1, 2, 3]; |
| |
| } |
3. 数组长度
使用 .len()
获取数组的长度:
| fn main() { |
| let arr = [10, 20, 30]; |
| println!("Array length: {}", arr.len()); |
| } |
数组的特性
1. 数组是固定大小的
数组的长度在编译时必须确定,不能动态改变。
2. 数组是连续存储的
数组中的元素在内存中是连续排列的,这使得访问速度更快。
3. 复制与赋值
数组是栈分配的,赋值或传递数组时会复制整个数组:
| fn main() { |
| let arr1 = [1, 2, 3]; |
| let arr2 = arr1; |
| println!("{:?}, {:?}", arr1, arr2); |
| } |
数组的迭代
使用 for
循环或迭代器方法:
| fn main() { |
| let arr = [10, 20, 30]; |
| |
| |
| for element in arr.iter() { |
| println!("{}", element); |
| } |
| |
| |
| for i in 0..arr.len() { |
| println!("arr[{}] = {}", i, arr[i]); |
| } |
| } |
多维数组
Rust 支持多维数组,例如二维数组:
| fn main() { |
| let matrix: [[i32; 3]; 2] = [ |
| [1, 2, 3], |
| [4, 5, 6] |
| ]; |
| |
| for row in &matrix { |
| for &value in row { |
| print!("{} ", value); |
| } |
| println!(); |
| } |
| } |
输出:
常用操作与方法
方法 |
描述 |
示例 |
.len() |
返回数组长度 |
[1, 2, 3].len() -> 3 |
.is_empty() |
判断数组是否为空 |
[1, 2].is_empty() -> false |
.iter() |
返回一个迭代器 |
[1, 2].iter() -> Iter |
.get(idx) |
安全获取指定索引的元素(返回 Option ) |
[1, 2].get(1) -> Some(2) |
.first() |
返回第一个元素(Option ) |
[1, 2].first() -> Some(1) |
.last() |
返回最后一个元素(Option ) |
[1, 2].last() -> Some(2) |
示例:
| fn main() { |
| let arr = [10, 20, 30]; |
| |
| println!("First: {:?}", arr.first()); |
| println!("Last: {:?}", arr.last()); |
| println!("Element at 1: {:?}", arr.get(1)); |
| println!("Out of bounds: {:?}", arr.get(3)); |
| } |
数组和切片
数组可以隐式转换为切片(&[T]
),切片用于动态数组的操作:
| fn main() { |
| let arr = [1, 2, 3, 4, 5]; |
| |
| let slice = &arr[1..4]; |
| println!("{:?}", slice); |
| } |
数组和动态数组(Vec)的区别
- 数组(
[T; N]
):大小固定,存储在栈上。
- 动态数组(
Vec<T>
):大小可变,存储在堆上。
动态数组适用于大小未知或需要动态调整的场景:
| fn main() { |
| let mut vec = vec![1, 2, 3]; |
| vec.push(4); |
| println!("{:?}", vec); |
| } |
Rust 中的数组适合用于固定大小且性能敏感的场景。如果需要灵活性,通常会使用 Vec<T>
。
tuple
元组是不同类型的值的集合。元组的大小是固定的,也就是说,一旦定义了元组的长度和类型,它就不能改变。
| let cat = ("Furry McFurson", 3.5); |
| let name = &cat.0; |
| let age = &cat.1; |
元组嵌套
| let nested_tuple = ((1, 2), (3.14, 'b')); |
| println!("{:?}", nested_tuple); |
解构元组
| fn main() { |
| let tuple = (42, 3.14, 'a'); |
| let (_, y, z) = tuple; |
| println!("y: {}, z: {}", y, z); |
| } |
match使用示例:
| fn main() { |
| let point = (0, -2); |
| |
| match point { |
| (0, y) => println!("Point lies on the y-axis at {}", y), |
| (x, 0) => println!("Point lies on the x-axis at {}", x), |
| (_, _) => println!("Point is somewhere else"), |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探