rust结构体

在 Rust 中,结构体(Struct)是组织数据的核心方式。根据外观和用途,结构体主要分为以下 3 种基本形式

1. 经典结构体 (Field Struct)

这是最常用的形式,类似于 C 语言或 Java 的类,具有具名的成员变量。
  • 语法:struct Name { field: Type, ... }
  • 用途:用于存储具有明确业务含义的数据集
  • 示例:
    struct User {
        id: u32,
        username: String,
        active: bool,
    }

2. 元组结构体 (Tuple Struct)

没有字段名,只有字段类型。通过索引(.0.1)访问。
  • 语法:struct Name(Type, Type, ...);
  • 用途:
    • Newtype 模式:为现有类型创建包装,增强类型安全性(例如:防止误将 UserId 当做 OrderId)。
    • 简单聚合:当字段含义非常明显时(如坐标、颜色值)。
  • 示例:
    struct Color(i32, i32, i32);
    struct UserId(u64); // Newtype 模式

3. 单元结构体 (Unit-Like Struct)

完全没有字段,不占用内存空间(Size = 0)。
  • 语法:struct Name;
  • 用途:
    • Trait 载体仅为了在某个类型上实现 Trait 而定义,本身不存数据。
    • 状态机标记:作为编译期的状态标记。
  • 示例:
    struct GlobalConfig;
    impl SomeTrait for GlobalConfig { ... }

4. 不透明/透明结构体 (Opaque Struct) —— FFI 专用变体

在涉及 C 语言交互的项目中,为了模拟 C 的“不透明指针”,常使用带私有字段的结构体。
  • 形式:pub struct SCBuilder { _unused: [u8; 0] }
  • 用途:
    • 所有权隔离:禁止在 Rust 侧直接实例化(因为 _unused 字段是私有的)。
    • 类型安全:确保该指针只能与 SCBuilder 相关的函数配合使用,不能传给其他 C 接口。 

5. 递归结构体 (Recursive Struct) —— 配合智能指针

Rust 要求结构体大小在编译期确定,因此递归结构体必须配合 Box
  • 形式:struct Node { data: i32, next: Option<Box<Node>> }
  • 用途:用于实现链表、树、图等动态拓扑结构。
总结对比表
形式实例化语法内存占用核心使用场景
经典结构体 User { id: 1, ... } 所有字段总和 业务实体、复杂配置
元组结构体 UserId(1) 同内部字段 类型包装 (Newtype)、坐标点
单元结构体 let x = Name; 0 字节 Trait 实现、占位符
不透明结构体 禁止直接实例化 0 字节 FFI/C 语言底层指针对接
建议:
如果只是想通过类型系统区分两个 u32(如 Width 和 Height),用元组结构体;如果是描述一个对象模型,用经典结构体;如果是对接 C 语言的不明结构,用带有私有 [u8; 0] 字段的不透明结构体。

参考资料:

1.rust语言元组结构体

posted @ 2026-01-09 16:49  PKICA  阅读(35)  评论(0)    收藏  举报