当前位置: 首页 > news >正文

从零开始学Rust:结构体(struct)详解

文章目录

  • 1. 基本结构体定义
  • 2. 字段初始化简写
  • 3. 结构体更新语法
  • 4. 元组结构体和无字段结构体
  • 5. 结构体使用示例
  • 6. 打印结构体
  • 7. 方法

1. 基本结构体定义

结构体是Rust中自定义的数据类型,用于将相关联的数据组合在一起。例如定义一个用户结构体:

struct User {
    username: String,    // 用户名
    email: String,       // 邮箱
    sign_in_count: u64,  // 登录次数
    active: bool,        // 是否活跃
}

重要特性:

  • 可以包含不同类型的数据字段
  • 整个实例必须是可变的(不能单独标记某个字段)
  • 如果实例声明为mut,则可以修改其字段
let mut user1 = User {
    email: String::from("someone@example.com"),
    // ...其他字段
};

user1.email = String::from("new@example.com"); // 允许修改

2. 字段初始化简写

当变量名与字段名相同时,可以使用简写语法:

fn build_user(email: String, username: String) -> User {
    User {
        email,    // 等同于 email: email
        username, // 等同于 username: username
        active: true,
        sign_in_count: 1,
    }
}

3. 结构体更新语法

基于已有结构体创建新结构体,使用…语法:

let user2 = User {
    email: String::from("another@example.com"),
    username: String::from("newuser"),
    ..user1  // 复制user1的剩余字段
};

4. 元组结构体和无字段结构体

元组结构体:有名字的元组

struct Color(i32, i32, i32);
let black = Color(0, 0, 0);

无字段结构体(单元结构体):用于实现trait等场景

struct EmptyStruct;

5. 结构体使用示例

使用元组重构

fn area(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}

使用结构体重构(更清晰)

struct Rectangle {
    width: u32,
    height: u32,
}

fn area(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}

6. 打印结构体

使用#[derive(Debug)]实现调试打印:

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

println!("rect1 is {:?}", rect1);       // 单行打印
println!("rect1 is {:#?}", rect1);     // 美化多行打印

7. 方法

方法与函数的区别:

  • 定义在结构体的impl块中
  • 第一个参数总是self(表示结构体实例)
impl Rectangle {
    // 方法 - 有self参数
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    // 关联函数 - 没有self参数
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

// 调用方法
rect1.area();

// 调用关联函数
let sq = Rectangle::square(10);

关键点:

  • &self表示不可变借用
  • &mut self表示可变借用
  • self表示获取所有权(较少使用)
  • 关联函数(没有self)常用于构造函数

Rust会自动处理方法的引用/解引用,所以不需要像C++那样的 → \rightarrow 操作符。

相关文章:

  • leetcode每日一题:数组美丽值求和
  • 【重点】文件摆渡系统如何简化跨平台跨网络的文件传输?
  • 使用Python构建Kafka示例项目
  • 视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案
  • es8实现向量检索与关键词匹配混合搜索
  • 算法题(114):矩阵距离
  • 计算机网络 3-1 数据链路层
  • 从零开始开发HarmonyOS应用并上架
  • AI 防口误指南_LLM 输出安全实践
  • 问题:tomcat下部署eureka双重路径
  • Laraver SQL日志 服务开发
  • wsl2配置proxy
  • git配置github
  • [c语言日寄]文件操作
  • OpenAI发布PaperBench,AI代理复现研究能力面临新考验
  • Ubuntu 22.04 一键部署openManus
  • 轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践
  • 最新全开源码支付系统,赠送3套模板
  • 深度学习基础
  • 在线Pdf文档转换成Excel文档,无需下载,快速转换,批量转换
  • 品牌网站设计地址/十大外贸电商平台
  • 泰州网站建设方案优化/2023b站推广大全
  • 淘宝联盟个人网站怎么做/seo技术快速网站排名
  • 做网站赚钱但又不想开公司/怎么找到精准客户资源
  • 做兼职网站哪个靠谱吗/营销培训课程ppt
  • 类似于美团的网站开发/国家域名注册服务网