【编程开发】Rust 语法速查 & 例子 - 数据结构

本文介绍了Rust中的关键概念,包括数据类型定义(如struct、enum、union等)、内存位置、变量声明(let和letmut)、移动语义以及基本的数据结构(如结构体、枚举、元组和数组)的创建与访问。
摘要由CSDN通过智能技术生成

本系列是学习 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 不能 Copyy 将不再可用,否则 y 会复制一份。

1 绑定变量 生存在栈上的同步代码。在 async{} 中,这些变量将成为异步状态机的一部分,最终驻留在堆上。
2 严密地来说 可变不可变 并不准确。不可变绑定或共享引用可能仍然包含 Cell ,从而提供 内部可变性

数据结构的简单示例:

  1. 定义结构体struct):用于定义包含命名字段的结构体类型。示例:

    struct Person {
        name: String,
        age: u32,
    }
    
  2. 元组结构体:结构体的一种变体,使用元组形式定义字段。示例:

    struct Point(f64, f64);
    
  3. 零大小结构体:定义一个没有任何字段的结构体,不占用内存空间。示例:

    struct EmptyStruct;
    
  4. 定义枚举enum):用于定义一组相关的命名常量集合。示例:

    enum Direction {
        Up,
        Down,
        Left,
        Right,
    }
    
  5. 变体枚举:枚举可以包含不同类型的变体,包括单元、元组和结构体。示例:

    enum Shape {
        Circle(f64),
        Rectangle { width: f64, height: f64 },
        Triangle(f64, f64, f64),
    }
    
  6. 枚举判别式:可以为枚举的每个变体指定判别式值。示例:

    enum Status {
        Success = 0,
        Error = 1,
    }
    
  7. 联合体union):不安全的 C 风格联合体,用于兼容 FFI。示例:

    union IntOrFloat {
        i: i32,
        f: f32,
    }
    
  8. 全局变量static):具有 'static 生命周期的全局变量,内存位置独立。示例:

    static PI: f64 = 3.14159;
    
  9. 常量const):定义一个不可变的常量。示例:

    const MAX_NUM: u32 = 100;
    
  10. 变量声明let):在栈上分配空间并定义变量。示例:

    let x: i32 = 42;
    
  11. 可变变量声明let mut):类似于 let,但允许修改其值。示例:

    let mut count = 0;
    count += 1;
    
  12. 移动语义:将一个值从一个变量移动到另一个变量,如果值不可复制,则移动操作将使源变量不再可用。示例:

    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]nx 副本构建的数组实例。
[x, y]由给定元素 xy构成的数据实例。
     ~~~~     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)

* 待处理的正在跟踪问题。

说明和简单示例:

  1. 构建结构体实例:使用结构体语法构建结构体实例,可以指定字段的名称和值。示例:

    struct Point {
        x: i32,
        y: i32,
    }
    let origin = Point { x: 0, y: 0 };
    
  2. 构建枚举变体实例:使用枚举变体的路径和结构体语法构建枚举变体实例。示例:

    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 };
    
  3. 元组和元组表达式:元组是将多个值组合在一起的简单数据结构。示例:

    let tuple: (i32, f64, &str) = (42, 3.14, "hello");
    
  4. 数组和数组表达式:固定大小的相同类型元素的集合。示例:

    let arr: [i32; 5] = [1, 2, 3, 4, 5];
    
  5. 索引和切片:通过索引访问数组或切片中的元素,或者通过范围进行切片操作。示例:

    let arr = [1, 2, 3, 4, 5];
    let first_element = arr[0];
    let slice = &arr[1..3];
    
  6. 字段访问:通过结构体或枚举实例的字段名称访问字段值。示例:

    let point = Point { x: 10, y: 20 };
    println!("x coordinate: {}", point.x);
    
  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值