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

【Rust】结构体示例与调试

目录

思维导图

1. 引言

2. 初始程序示例

3. 使用元组重构

4. 使用结构体重构

5. 调试与输出

6. 进一步的功能扩展


思维导图

1. 引言

  • 本文通过一个计算矩形面积的程序,展示了如何从简单变量逐步重构到使用结构体,以提高代码的清晰度和可管理性。结构体是Rust中组织复杂数据的重要工具,能够显著提升代码的可读性和可维护性。

2. 初始程序示例

  • 基本实现
    • 使用单独的变量定义矩形的宽度和高度,并通过area函数计算面积。
    • 示例代码:
      fn main() {
          let width1 = 30;
          let height1 = 50;
          println!(
              "The area of the rectangle is {} square pixels.",
              area(width1, height1)
          );
      }
      fn area(width: u32, height: u32) -> u32 {
          width * height
      }
      
    • 输出结果程序运行后成功计算出矩形的面积为1500像素。
    • 问题宽度和高度作为独立的变量传递,缺乏语义关联。

3. 使用元组重构

  • 问题识别
    • 原始代码在area函数中使用两个参数,缺乏参数之间的关联性,导致可读性差。
  • 重构为元组
    • 使用元组将宽度和高度组合为一个参数,增强数据的关联性。
    • 示例代码:
      fn main() {
          let rect1 = (30, 50);
          println!(
              "The area of the rectangle is {} square pixels.",
              area(rect1)
          );
      }
      fn area(rect_tuple: (u32, u32)) -> u32 {
          rect_tuple.0 * rect_tuple.1
      }
      
    • 优缺点
      • 优点:传递单个参数,稍微增加了结构。
      • 缺点:元组元素没有命名,导致代码可读性降低,容易引入错误。

4. 使用结构体重构

  • 引入结构体
    • 通过定义结构体为矩形增加语义,明确宽度和高度的关系。
    • 示例代码:
      struct Rectangle {
          width: u32,
          height: u32,
      }
      fn main() {
          let rect1 = Rectangle {
              width: 30,
              height: 50,
          };
          println!(
              "The area of the rectangle is {} square pixels.",
              area(&rect1)
          );
      }
      fn area(rectangle: &Rectangle) -> u32 {
          rectangle.width * rectangle.height
      }
      
    • 优势
      • 通过命名字段,代码更加清晰,易于理解。
      • area函数只需一个参数,且明确表示该参数是一个矩形实例。
      • 结构体提供了更强的类型安全性,避免了参数顺序错误等问题。

5. 调试与输出

  • 实现调试输出
    • 默认情况下,结构体无法直接使用println!输出,需要实现Debug特征
    • 通过#[derive(Debug)]注解自动实现Debug特征,使结构体可以格式化输出。
    • 示例代码:
      #[derive(Debug)]
      struct Rectangle {
          width: u32,
          height: u32,
      }
      fn main() {
          let rect1 = Rectangle {
              width: 30,
              height: 50,
          };
          println!("rect1 is {:?}",rect1);
      }
      
    • 输出结果程序成功输出矩形的所有字段值,帮助调试。

6. 进一步的功能扩展

  • 使用dbg!
    • dbg!宏可以帮助开发者在调试过程中查看变量的值及其所在行号。
    • 示例代码:
      #[derive(Debug)]
      struct Rectangle {
          width: u32,
          height: u32,
      }
      fn main() {
          let scale = 2;
          let rect1 = Rectangle {
              width: dbg!(30 * scale),
              height: 50,
          };
          dbg!(&rect1);
      }
    • 输出结果输出了计算过程中的中间值和最终的结构体值。
    • 示例输出:
      [src/main.rs:6] 30 * scale = 60
      [src/main.rs:9] &rect1 = Rectangle {
          width: 60,
          height: 50,
      }

       


http://www.kler.cn/a/505212.html

相关文章:

  • Stream流
  • 第G1周:生成对抗网络(GAN)入门
  • Docker常用命令大全
  • Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)
  • CAPL与CAN总线通信
  • RabbitMQ 高可用方案:原理、构建与运维全解析
  • 关于反向传播算法个人的一些思考
  • 登录系统网址作业
  • 数学:机器学习的理论基石
  • 如何安装cnpm
  • 【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库
  • MYSQL的第一次作业
  • 一个超快低延迟.Net网络通信库:支持TCP, SSL, UDP, HTTP,HTTPS, WebSocket多协议
  • 32单片机综合应用案例——智能家居灯光控制系统(二)(内附详细代码讲解!!!)
  • 《零基础Go语言算法实战》【题目 4-7】实现链表的排序
  • ukui-quick 计数器
  • 框架集成Minio(内含Minio工具类以及mc突破七天限制)
  • 如何为Python程序单独创建虚拟运行环境(Win/Mac/Linux)
  • GPT-4o背后的语音技术
  • 校园跑腿小程序--我的,登录和注册页面开发
  • Springboot集成Easy Rules引擎,实现一个商品优惠券系统
  • 数据结构(Java版)第九期:LinkedList与链表
  • 《Java核心技术II》实现服务器
  • vue3 父组件调用子组件方法
  • 在 WSL Ubuntu 上安装 ProxySQL 并配置 主从同步,读写分离,延迟检测
  • C++并发编程之掩藏任务延迟与提高响应性的应用说明