文章目录

      • 结构体实战:用Rust编写矩形面积计算器
        • 📐 问题描述
        • 1️⃣ 基础版:独立变量(混乱版)
        • 2️⃣ 进阶版:使用元组
        • 3️⃣ 终极版:使用结构体(优雅版)
        • 🎯 运行结果
        • 💡 结构体编程优势
        • 🔍 关键语法解析

结构体实战:用Rust编写矩形面积计算器

让我们通过一个生动的例子来探索Rust结构体的强大功能!我们将创建一个矩形面积计算器,逐步展示如何使用结构体组织相关数据。

📐 问题描述

计算不同尺寸矩形的面积,并优雅地展示计算结果。我们将经历三个进化阶段:

  1. 基础版:使用独立变量
  2. 进阶版:使用元组
  3. 终极版:使用结构体

1️⃣ 基础版:独立变量(混乱版)
fn main() {let width = 30;let height = 50;println!("矩形面积:{} 平方像素",calculate_area(width, height));
}fn calculate_area(w: u32, h: u32) -> u32 {w * h
}
矩形面积:1500 平方像素

🚨 问题:参数之间没有明确关联,代码可读性差


2️⃣ 进阶版:使用元组
fn main() {let rect = (30, 50);println!("矩形面积:{} 平方像素",calculate_area(rect));
}fn calculate_area(dimensions: (u32, u32)) -> u32 {dimensions.0 * dimensions.1
}
矩形面积:1500 平方像素

⚠️ 改进:数据被分组了
⚠️ 新问题dimensions.0是什么?宽度还是高度?不直观!


3️⃣ 终极版:使用结构体(优雅版)
// 定义矩形结构体
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}impl Rectangle {// 关联函数:创建正方形fn square(size: u32) -> Self {Self {width: size,height: size,}}// 方法:计算面积fn area(&self) -> u32 {self.width * self.height}// 方法:检查是否能容纳另一个矩形fn can_hold(&self, other: &Rectangle) -> bool {self.width > other.width && self.height > other.height}
}fn main() {// 创建矩形实例let rect1 = Rectangle {width: 30,height: 50,};// 创建正方形let square = Rectangle::square(25);// 调试打印println!("📐 rect1结构详情:{:#?}", rect1);println!("🔲 正方形结构:{:?}", square);// 计算面积println!("📏 矩形面积:{} 平方像素", rect1.area());println!("⬜ 正方形面积:{} 平方像素", square.area());// 高级调试let scale = 2;let debug_rect = Rectangle {width: dbg!(30 * scale),  // 实时调试表达式height: 50,};dbg!(&debug_rect);  // 打印完整结构体// 矩形包含检测println!("rect1能容纳正方形吗? {}", rect1.can_hold(&square));
}
🎯 运行结果
📐 rect1结构详情:Rectangle {width: 30,height: 50,
}
🔲 正方形结构:Rectangle { width: 25, height: 25 }
📏 矩形面积:1500 平方像素
⬜ 正方形面积:625 平方像素
[src/main.rs:40] 30 * scale = 60
[src/main.rs:43] &debug_rect = Rectangle {width: 60,height: 50,
}
rect1能容纳正方形吗? true

运行效果截图


💡 结构体编程优势
  1. 语义清晰:字段命名使数据含义一目了然
  2. 功能封装:相关方法直接与数据结构绑定
  3. 调试友好
    • #[derive(Debug)] 自动实现调试打印
    • dbg!宏精确追踪表达式值
  4. 扩展性强:轻松添加新方法(如can_hold
🔍 关键语法解析
// 定义结构体
struct MyStruct {field1: Type,field2: Type,
}// 实现方法
impl MyStruct {// 关联函数(静态方法)fn new() -> Self { /* ... */ }// 实例方法fn method(&self) { /* ... */ }
}// 自动派生功能
#[derive(Debug)]  // 启用调试打印

掌握了结构体,你就拥有了在Rust中组织复杂数据的超能力!💪🏻 尝试给你的结构体添加更多方法,比如计算周长或绘制图形功能吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87630.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87630.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87630.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于开源链动2+1模式AI智能名片S2B2C商城小程序的场景零售创新研究

摘要:本文聚焦场景消费逻辑,探讨开源链动21模式AI智能名片S2B2C商城小程序在场景零售中的应用。通过分析场景消费中消费者体验的关键作用,结合该技术组合的特性,阐述其如何优化场景内容、增强场景美感,为消费者创造超乎…

新发布:26考研院校和专业大纲

复习方向错了,努力可能白费 近日,多所高校陆续发布2026年硕士研究生招生考试自命题科目大纲,为备考的学子们指明了复习方向。今年的考纲有哪些重要变化?又该如何应对?本文为你全面梳理! 院校和专业发布详情…

matlab/Simulink-全套50个汽车性能建模与仿真源码模型9

50个simulink模型(所有模型罗列如下,没罗列就是没有,包含子模块总共50个。) 基于汽车驱动力-行驶阻力平衡图的汽车动力性仿真模型 基于汽车动力特性图的汽车动力性仿真模型 基于汽车功率平衡图的汽车动力性仿真模型 电动汽车动力…

为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析

为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析 引言 在卫星姿态控制系统中,星敏感器(Star Tracker, 简称“星敏”) 是最精确的姿态测量设备之一,其精度可达角秒级&…

【Cocos TypeScript 零基础 24.1】

目录 首次实战开发心得实战项目<修仙录游戏> 首次实战开发心得 遇到的技术问题也多 发表问题也不少 收入问题 本人都将会写篇专栏总结一下 实战项目<修仙录游戏> 上图是已上线的实战项目二维码 耗费的时间太久了 下次将跟新开发遇到的各种奇奇怪怪的问题 各位看…

Linux关机指令详解:shutdown命令的使用指南

掌握shutdown命令的正确使用对于Linux系统管理员至关重要&#xff0c;它不仅能确保系统安全关闭&#xff0c;还能避免数据丢失和用户工作中断。 目录 一、基本语法 二、常用选项 三、使用示例 立即关机 10分钟后关机 指定时间关机&#xff08;如23:00&#xff09; 重启系…

青少年编程与数学 02-022 专业应用软件简介 08 电子设计自动化软件

青少年编程与数学 02-022 专业应用软件简介 08 电子设计自动化软件一、什么是EDA软件&#xff08;一&#xff09;定义与起源&#xff08;二&#xff09;功能与分类&#xff08;三&#xff09;技术发展趋势二、EDA软件在当前国际竞争中的重要性&#xff08;一&#xff09;技术壁…

TypeScript系列:第六篇 - 编写高质量的TS类型

掌握这些&#xff0c;ts类型声明事半功倍 &#x1f4aa;&#x1f3fb; 不要做 永远不要使用类型 Number、String、Boolean、Symbol 或 Object 这些类型指的是非原始装箱对象&#xff0c;使用 number、string、boolean 和 symbol 类型不要使用 any 作为类型&#xff0c;除非正在…

逐步构建高性能http服务器及聊天室服务器

目录 如何拿到浏览器发来的http请求 如何给浏览器发送响应 响应基本原理 给浏览器发送一个网页作为响应 给浏览器发送一个图片作为响应 接下来我们要做什么 完善业务逻辑 浏览器如何访问特定文件 访问根目录下的文件 访问子文件夹下的文件 习惯性目录结构 GET请求带…

水下航行器外形分类详解

在水下航行器的设计领域&#xff0c;外形是影响其性能和功能的关键因素之一。根据不同的设计目的和应用场景&#xff0c;水下航行器的外形可以按照多种方式进行分类。 本文将详细介绍几种常见的分类方式及其对应的外形特点。 按流体动力布局分类 标准回转体 外形标准回转体外…

Ubuntu:Mysql服务器

mariadb与mysql完全兼容&#xff0c;使用时感受不到差别 目录 1 mariadb的安装2 启动mysql3 关闭防火墙4 连接到mysql5 Mysql的配置文件6 Mysql远程访问 1 mariadb的安装 apt install mariadb-server检查安装 ls /etc/init.d2 启动mysql service mysql restart3 关闭防火墙…

使用systemd 监控服务并实现故障自动重启

一、为什么需要自动重启&#xff1f; 在生产环境中&#xff0c;服务可能因内存溢出、资源竞争、外部依赖中断等问题意外崩溃。手动恢复效率低下&#xff0c;而 systemd 的自动重启机制可在秒级内恢复服务&#xff0c;显著提升系统可用性。 ⚙️ 二、systemd 自动重启的核心配置…

在 React 中使用 WebSockets 构建实时聊天应用程序

实时通信已成为现代 Web 应用程序&#xff08;尤其是在聊天应用程序中&#xff09;不可或缺的功能。实时通信提供了一种强大的方法来实现客户端和服务器之间的实时双向通信。在本指南中&#xff0c;我们将逐步讲解如何使用React WebSockets构建实时聊天应用程序。 先决条件 在…

实验五-Flask的简易登录系统

一、实验目的和任务 1.掌握Flask框架的基本使用方法 2.理解Web应用的会话管理机制 3.实现用户认证系统的基本功能 4.学习模板继承和表单处理技术 要求&#xff1a;请将思考题的答案写在实验报告中 二、实验内容 1.基础环境搭建&#xff1a;创建项目目录结构、安装必要依赖包…

WebSocket类明明注入了Bean,为什么报错为null

在 WebSocket 类中注入 Bean 看似可行而注入 Bean 报错为null&#xff0c;通常是由于Spring 的单例管理机制与 WebSocket 多实例创建特性冲突导致的&#xff0c;具体分析如下&#xff1a;原因分析Spring 的单例特性&#xff1a;Spring 默认以单例模式管理 Bean&#xff0c;即一…

Python 爬虫开发指南:从基础到实战

在大数据时代&#xff0c;数据成为了宝贵的资源。Python 爬虫作为高效获取网络数据的工具&#xff0c;受到越来越多开发者的关注。本文将详细介绍 Python 爬虫的相关知识&#xff0c;助你快速入门并掌握爬虫开发的核心要点。 一、Python 爬虫概述 Python 爬虫&#xff0c;即网…

99、git 超时问题

报错&#xff1a; Push failed ssh: connect to host github.com port 22: Connection timed out Could not read from remote repository

CountDownLatch 详细介绍

CountDownLatch 是 Java 中 java.util.concurrent 包提供的一个同步工具类&#xff0c;用于协调多个线程之间的执行顺序。它允许一个或多个线程等待&#xff0c;直到其他线程完成一组操作后继续执行。CountDownLatch 是一种倒计数锁存器&#xff0c;通过设置一个初始计数器值&a…

Hadoop之HDFS

Hadoop之HDFS HDFS的Shell操作 启动Hadoop集群(方便后续测试) [atguigu@hadoop102 ~]$ sbin/start-dfs.sh [atguigu@hadoop102 ~]$ sbin/start-yarn.sh-help:输出这个命令参数 [atguigu@hadoop102 ~]$ hadoop fs -help rm-ls:显示目录信息 [atguigu@hadoop102 ~]$ hadoop …

【1.4 漫画PostgreSQL高级数据库及国产数据库对比】

&#x1f418; 漫画PostgreSQL高级数据库及国产数据库对比 &#x1f468;‍&#x1f4bb; 小明&#xff1a;“老王&#xff0c;除了MySQL&#xff0c;还有哪些优秀的关系型数据库&#xff1f;国产数据库发展得怎么样&#xff1f;” &#x1f9d9;‍♂️ 架构师老王&#xff1a;…