【Rust】结构体示例与调试

server/2025/1/15 16:26:14/

目录

思维导图

1. 引言

2. 初始程序示例

3. 使用元组重构

4. 使用结构体重构

5. 调试与输出

6. 进一步的功能扩展


思维导图

1. 引言

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

2. 初始程序示例

  • 基本实现
    • 使用单独的变量定义矩形的宽度和高度,并通过area函数计算面积。
    • 示例代码:
      rust">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函数中使用两个参数,缺乏参数之间的关联性,导致可读性差。
  • 重构为元组
    • 使用元组将宽度和高度组合为一个参数,增强数据的关联性。
    • 示例代码:
      rust">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. 使用结构体重构

  • 引入结构体
    • 通过定义结构体为矩形增加语义,明确宽度和高度的关系。
    • 示例代码:
      rust">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特征,使结构体可以格式化输出。
    • 示例代码:
      rust">#[derive(Debug)]
      struct Rectangle {width: u32,height: u32,
      }
      fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("rect1 is {:?}",rect1);
      }
      
    • 输出结果程序成功输出矩形的所有字段值,帮助调试。

6. 进一步的功能扩展

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

       


http://www.ppmy.cn/server/158602.html

相关文章

微信小程序获取当前页面路径,登录成功后重定向回原页面

🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回&#…

java流式处理zip+多线程

概述 流式处理一个zip,zip里有多个json文件。 流式处理可以避免解压一个大的zip。再加上多线程,处理的效率杠杠的。 代码 package 多线程.demo05多jsonCountDownLatch;import com.fasterxml.jackson.databind.ObjectMapper; import lombok.SneakyThro…

Python爬虫-爬取汽车之家全部汽车品牌的brandid(品牌ID)

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 本文以汽车之家平台为例子,获取所有汽车品牌的“全部品牌ID”,即brandid数据。如下所示: 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下看正文详…

Mycat读写分离搭建及配置超详细!!!

目录 一、Mycat产生背景二、Mycat介绍三、Mycat安装四、Mycat搭建读写分离1、 搭建MySQL数据库主从复制2、 基于mysql主从复制搭建MyCat读写分离 五、Mycat启动常见错误处理1、Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TESTDB refered by user u…

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据,实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍: 1.RabbitMQ 特点: • 基于AMQP&#…

【深度学习】神经网络灾难性遗忘(Catastrophic Forgetting,CF)问题

文章目录 1. 什么是灾难性遗忘?2. 为什么会存在灾难性遗忘?2.1 网络权重的更新2.2 没有有效的记忆机制2.3 任务间数据分布差异 3. 目前解决方案3.1 弹性权重保持(Elastic Weight Consolidation, EWC)3.2 其他方法 1. 什么是灾难性…

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解

分布式系统理论:CAP 与 BASE 详解 一、CAP 定理 背景与定义:1998 年由加州大学科学家埃里克布鲁尔提出,分布式系统存在一致性(Consistency)、可用性(Availability)、分区容错性(Part…

浅谈ArcGIS的地理处理(GP)服务之历史、现状和未来

ArcGIS的地理处理(GP)服务是由Esri开发的一套工具,旨在通过网络提供地理空间数据处理、分析和转换的能力。它的历史、现状和未来发展受到了GIS技术进步、用户需求变化以及云计算、大数据等技术变革的影响。以下将从历史、现状、未来三个方面详…