![cover](https://img-blog.csdnimg.cn/img_convert/5bbc102f2243430991aedee1be20b4f3.png)
【编程开发】Rust 语法速查 & 例子 - 数据结构
数据类型和内存位置由关键字定义。1 绑定变量 生存在栈上的同步代码。在中,这些变量将成为异步状态机的一部分,最终驻留在堆上。2 严密地来说_可变_和_不可变_并不准确。不可变绑定或共享引用可能仍然包含 Cell ,从而提供 内部可变性 。定义结构体():用于定义包含命名字段的结构体类型。示例:元组结构体:结构体的一种变体,使用元组形式定义字段。示例:零大小结构体:定义一个没有任何字段的结构体,不占
本系列是学习 Rust 的学习笔记,本编主要对 https://cheats.rs/ 的语法速查表进行翻译学习
数据类型和内存位置由关键字定义。
示例 | 说明 |
---|---|
struct S {} | 定义包含命名字段的 结构体 。 |
~~~~
struct S { x: T } | 定义包含 T 类型命名字段 x 的结构体。 |
~~~~
struct S(T); | 定义 T 类型数字字段 .0 的“元组”结构体。 |
~~~~
struct S; | 定义一个 零大小 的单元结构体。不占用任何空间,并进行了优化。 |
enum E {} | 定义 枚举 ,c。 |
~~~~
enum E { A, B(), C {} } | 定义变体枚举;可以是单元- A ,元组- B() 或则结构体风格的 C{} 。 |
~~~~
enum E { A = 1 } | 如果所有变体都是单元值,则允许判别式值,例如用于 FFI。 |
union U {} | 不安全的 C 风格 联合体 ,用于兼容 FFI。 🝖 |
static X: T = T(); | 有 'static 生命周期的 全局变量 ,内存位置独立。 |
const X: T = T(); | 定义 常量 ,使用时会临时复制一份。 |
let x: T; | 在栈上分配 T 大小的字节并命名为 x 。 一旦分配不可修改。 |
let mut x: T; | 类似于 let ,但允许 修改 以及可变借用。 |
~~~~
x = y; | 将 y 移动到 x ,如果 T 不能 Copy ,y 将不再可用,否则 y 会复制一份。 |
1 绑定变量 生存在栈上的同步代码。在 async{}
中,这些变量将成为异步状态机的一部分,最终驻留在堆上。
2 严密地来说 可变 和 不可变 并不准确。不可变绑定或共享引用可能仍然包含 Cell ,从而提供 内部可变性 。
数据结构的简单示例:
-
定义结构体(
struct
):用于定义包含命名字段的结构体类型。示例:struct Person { name: String, age: u32, }
-
元组结构体:结构体的一种变体,使用元组形式定义字段。示例:
struct Point(f64, f64);
-
零大小结构体:定义一个没有任何字段的结构体,不占用内存空间。示例:
struct EmptyStruct;
-
定义枚举(
enum
):用于定义一组相关的命名常量集合。示例:enum Direction { Up, Down, Left, Right, }
-
变体枚举:枚举可以包含不同类型的变体,包括单元、元组和结构体。示例:
enum Shape { Circle(f64), Rectangle { width: f64, height: f64 }, Triangle(f64, f64, f64), }
-
枚举判别式:可以为枚举的每个变体指定判别式值。示例:
enum Status { Success = 0, Error = 1, }
-
联合体(
union
):不安全的 C 风格联合体,用于兼容 FFI。示例:union IntOrFloat { i: i32, f: f32, }
-
全局变量(
static
):具有'static
生命周期的全局变量,内存位置独立。示例:static PI: f64 = 3.14159;
-
常量(
const
):定义一个不可变的常量。示例:const MAX_NUM: u32 = 100;
-
变量声明(
let
):在栈上分配空间并定义变量。示例:let x: i32 = 42;
-
可变变量声明(
let mut
):类似于let
,但允许修改其值。示例:let mut count = 0; count += 1;
-
移动语义:将一个值从一个变量移动到另一个变量,如果值不可复制,则移动操作将使源变量不再可用。示例:
let x = String::from("hello"); let y = x; // x 的所有权转移到 y,x 不再可用
下面列出了如何构建和访问数据结构;以及一些 独特的 类型。
示例 | 说明 |
---|---|
S { x: y } | 构建 struct S {} 或者 use ’ed enum E::S {} 字段 x 设置为 y 。 |
S { x } | 同上,但字段 x 会被设置为局部变量 x 。 |
S { ..s } | 用 s 填充剩余字段,常配合 Default 一起使用。 |
S { 0: x } | 类似于下面的 S (x) ,但是用结构体语法设置字段 .0 。 |
S (x) | 构建 struct S (T) 或者 use ’ed enum E::S () 其中字段 .0 设置为 x 。 |
S | 如果 S 是单元 struct S ;或以 S 为值构建 use ’ed enum E::S 。 |
E::C { x: y } | 构建枚举变体 C 。 上面的其他方法依然有效。 |
() | 空元组,既是字面量也是类型,又称单元。 |
(x) | 括号表达式。 |
(x,) | 单元素元组表达式。 |
(S,) | 单元素元组类型。 |
[S] | 未指明长度的的数组类型,如切片。 不能生存在栈上。* |
[S; n] | 元素类型为 S ,固定长度为 n 的数组类型。 |
[x; n] | 由 n 个 x 副本构建的数组实例。 |
[x, y] | 由给定元素 x 和 y 构成的数据实例。 |
~~~~
x[0] | 组合的索引,返回结果是 usize 类型。可重载 Index, IndexMut。 |
x[..] | 同样,通过范围(这里是_全部范围_),下面的 x[a..b] , x[a..=b] , …c 也一样。 |
a..b | 构建左闭右开区间,例如 1..3 表示 1, 2 。 |
..b | 无起点到右开区间。 |
a..=b | 全闭合区间 1..=3 表示 1, 2, 3 。 |
..=b | 无起点到右闭合区间。 |
.. | 全包含区间,通常表示_整个组合_。 |
s.x | 命名 字段访问,如果 x 不是 s 的一部分的话则会尝试 Deref。 |
s.0 | 数字字段访问,用于元组类型 S (T) 。 |
*
待处理的正在跟踪问题。
说明和简单示例:
-
构建结构体实例:使用结构体语法构建结构体实例,可以指定字段的名称和值。示例:
struct Point { x: i32, y: i32, } let origin = Point { x: 0, y: 0 };
-
构建枚举变体实例:使用枚举变体的路径和结构体语法构建枚举变体实例。示例:
enum Color { RGB { r: u8, g: u8, b: u8 }, CMYK { c: u8, m: u8, y: u8, k: u8 }, } let red = Color::RGB { r: 255, g: 0, b: 0 };
-
元组和元组表达式:元组是将多个值组合在一起的简单数据结构。示例:
let tuple: (i32, f64, &str) = (42, 3.14, "hello");
-
数组和数组表达式:固定大小的相同类型元素的集合。示例:
let arr: [i32; 5] = [1, 2, 3, 4, 5];
-
索引和切片:通过索引访问数组或切片中的元素,或者通过范围进行切片操作。示例:
let arr = [1, 2, 3, 4, 5]; let first_element = arr[0]; let slice = &arr[1..3];
-
字段访问:通过结构体或枚举实例的字段名称访问字段值。示例:
let point = Point { x: 10, y: 20 }; println!("x coordinate: {}", point.x);
更多推荐
所有评论(0)