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

Rust 再谈泛型

第一章:Trait约束 - 变形许可证系统

1.1 正面案例:持证上岗的变形金刚

trait Transform {fn transform(&self) -> String;
}struct Car {model: String
}impl Transform for Car {fn transform(&self) -> String {format!("{}变形为机器人!", self.model)}
}fn show_transformation<T: Transform>(item: T) {println!("{}", item.transform());
}let optimus = Car { model: "擎天柱".into() };
show_transformation(optimus); // 正确输出:擎天柱变形为机器人!

1.2 反面案例:无证变形的后果

struct Tree {height: u32
}// 没有为Tree实现Transform特质let oak = Tree { height: 20 };// 尝试调用会变形失败的代码
// show_transformation(oak); // 取消注释将看到编译器警告

编译器警告现场

error[E0277]: the trait bound `Tree: Transform` is not satisfied
就像交通警察拦下无证驾驶:"同志,请出示您的变形许可证!"

问题分析

  • 未实现必需特质就像没有驾照上路
  • 编译器化身严格交警,禁止危险操作

第二章:生命周期 - 主宠生死契约

2.1 正面案例:正确的生命绑定

struct Pet<'a> {name: &'a str,owner: &'a str
}fn main() {let owner = "张三";          // 主人先存在let dog = Pet {             // 宠物后创建name: "旺财", owner: &owner};println!("{}的宠物叫{}", dog.owner, dog.name); // 正常运行
}

2.2 反面案例:主人先走一步的悲剧

fn create_pet() -> Pet<'static> { // 试图伪造长期生命let owner = String::from("李四"); // 主人在函数内出生Pet {name: "咪咪",owner: &owner // 危险!试图引用局部变量}
} // owner在这里死亡,但宠物试图带它的灵魂离开// let ghost_pet = create_pet(); // 取消注释将见编译器咆哮

编译器怒吼现场

error[E0515]: cannot return value referencing local variable `owner`
就像阎王爷的生死簿:"李四阳寿已尽,不得带其灵魂出界!"

问题分析

  • 试图让宠物比主人长寿会制造"悬垂引用"
  • 编译器化身阎王爷,严格执行生死簿规则

第三章:泛型函数 - 变形类型安全

3.1 正面案例:合格的万能打印机

fn safe_printer<T: std::fmt::Debug>(item: T) {println!("调试信息:{:?}", item);
}safe_printer(42);     // 正确:整数可调试打印
safe_printer("test"); // 正确:字符串可调试打印

3.2 反面案例:打印不可打印之物

struct MysteryBox {content: String
}// 没有实现Debug特质let unknown = MysteryBox { content: "秘密".into() };// safe_printer(unknown); // 取消注释触发编译器防御

编译器防御系统

error[E0277]: `MysteryBox` doesn't implement `Debug`
就像打印机提示:"无法识别墨盒类型,请安装驱动!"

问题分析

  • 未实现必要特质就像使用不兼容的墨盒
  • 编译器化身精密打印机,拒绝错误输入

终章:综合大考验 - 星际动物园管理系统

use std::fmt::Display;// 生命周期标注的正反案例
struct Animal<'a> {name: &'a str,keeper: &'a str
}// 正确的特质约束
trait Feed {fn feed(&self) -> String;
}struct Panda<'a> {data: Animal<'a>
}impl<'a> Feed for Panda<'a> {fn feed(&self) -> String {format!("{}正在喂食{}", self.data.keeper, self.data.name)}
}fn main() {// 正确生命周期案例let keeper1 = "张饲养员";let lingling = Panda {data: Animal {name: "玲玲",keeper: keeper1}};println!("{}", lingling.feed()); // 正常输出// 危险的生命周期案例(注释掉的错误代码)// let trouble;// {//     let keeper2 = String::from("临时工");//     trouble = Panda {//         data: Animal {//             name: "麻烦",//             keeper: &keeper2//         }//     };// } // keeper2在此死亡// println!("{}", trouble.feed()); // 试图使用已死引用
}

正确输出:

张饲养员正在喂食玲玲

错误代码解注释后的编译器诊断:

error[E0597]: `keeper2` does not live long enough
就像动物园园长怒吼:"临时工已经离职,不能继续照顾动物!"

生存法则升级版

  1. 特质约束是变形许可证 → 无证变形会触发编译器特警
  2. 生命周期是阎王生死簿 → 试图篡改将遭编译器判官拦截
  3. 泛型是严格安检机 → 携带危险类型会被当场扣留
  4. 编译器是终极守护神 → 宁可错杀一千,不放一个隐患
  5. 错误提示是生存指南 → 仔细阅读可找到逃生路线

记住:在Rust的魔法世界里,编译器不是敌人,而是最严格的守护天使👼。那些看似烦人的错误提示,其实是防止你坠入深渊的安全绳!现在带着正反两面的经验,去建造更健壮的代码城堡吧!🏰🚀


🕵️♂️ 代码侦探时间:为什么没有报错?

如果使用下面的代码,程序不会报错,这是为什么呢
问题代码片段

let trouble;
{let keeper2 = "临时工"; // 这里埋下了伏笔trouble = Panda {data: Animal {name: "麻烦",keeper: keeper2}};
}
println!("{}", trouble.feed());

未报错的秘密

  1. 字符串字面量的特殊生命周期"临时工"&'static str类型
  2. 静态生命周期的欺骗性keeper2虽然定义在内部作用域,但它指向的数据实际存在于程序的整个生命周期
  3. 编译器看穿了一切:即使外层keeper2变量被丢弃,底层数据仍然有效

相关文章:

Rust 再谈泛型

第一章&#xff1a;Trait约束 - 变形许可证系统 1.1 正面案例&#xff1a;持证上岗的变形金刚 trait Transform {fn transform(&self) -> String; }struct Car {model: String }impl Transform for Car {fn transform(&self) -> String {format!("{}变形为…...

chrome插件模板;使用 React 18 和 Webpack 5 的 Chrome 扩展样板

一、软件介绍&#xff08;文末提供下载&#xff09; 这是一个基本的 Chrome 扩展样板&#xff0c;可帮助您编写模块化和现代的 Javascript 代码&#xff0c;轻松加载 CSS&#xff0c;并在代码更改时自动重新加载浏览器。 github地址&#xff1a;https://github.com/lxieyang/c…...

解锁.NET Fiddle:在线编程的神奇之旅

在.NET 开发的广袤领域中&#xff0c;快速验证想法、测试代码片段以及便捷地分享代码是开发者们日常工作中不可或缺的环节。而.NET Fiddle 作为一款卓越的在线神器&#xff0c;正逐渐成为众多.NET 开发者的得力助手。它打破了传统开发模式中对本地开发环境的依赖&#xff0c;让…...

AI大模型:DeepSeek

近期DeepSeek产生了很大的影响力。首先来自于性能,给了业内一个很好的释放,缓解了HPC以及大规模集群被卡的焦虑。通过实验证实了小规模团队(公开资料显示规模约150左右)在资源受限的情况下(2M H100 GPU时),依然可以完成对领先大模型的实现与部署。后续观察该团队是否可以…...

Spring MVC ONE

第一章&#xff1a;Java web的发展历史 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff1a;JSPJavaBean的模式&#xff0c;它的核心是Jsp页面&#xff0c;在这个页面中&#xff0c;Jsp页面负责整合页面和JavaBean&#xff08;业务逻辑&#xff09;&…...

【Git】一、初识Git Git基本操作详解

文章目录 学习目标Ⅰ. 初始 Git&#x1f4a5;注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日…...

SQL 秒变三线表 sql导出三线表

&#x1f3af;SQL 秒变三线表&#xff0c;校园小助手超神啦 宝子们&#xff0c;搞数据分析、写论文的时候&#xff0c;从 SQL 里导出数据做成三线表是不是特别让人头疼&#x1f629; 手动调整格式&#xff0c;不仅繁琐&#xff0c;还容易出错&#xff0c;分分钟把人逼疯&#…...

PySpark学习笔记5-SparkSQL

sparkSql的数据抽象有两种。 一类是data set适用于java和Scala 一类是data frame适用于java&#xff0c;Scala&#xff0c;python 将r d d转换为data frame #方式一 df spark.createDataFrame(rdd,schema[name,age]) #方式二 schema Structtype(). add(id,integertype(),nu…...

ES6 字符串、数值、数组扩展使用总结

1. 字符串的扩展方法 1.1 includes() // 判断字符串是否包含指定字符串 const str Hello World; console.log(str.includes(Hello)); // true console.log(str.includes(hello)); // false console.log(str.includes(World, 6)); // true - 从位置6开始搜索// 实际应用 func…...

项目测试之Postman

文章目录 基础实战进行批量测试并输出报告 基础 实战 进行批量测试并输出报告 参考&#xff1a; https://blog.csdn.net/tyh_keephunger/article/details/109205191 概述 Newman是什么&#xff1f;Newman是Postman的命令行工具&#xff0c;用于执行接口测试集合。操作过程…...

C#常用744单词

1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的&#xff0c;锋利的。 6.amework 骨架&#xff0c;构架&#xff0c;框架 7.beta 测试版&#xff0c;试用版 8.XML&#xff08;全称&#xff1a;eXtensible Markup Language&#xff09…...

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…...

图像分类与目标检测算法

在计算机视觉领域&#xff0c;图像分类与目标检测是两项至关重要的技术。它们通过对图像进行深入解析和理解&#xff0c;为各种应用场景提供了强大的支持。本文将详细介绍这两项技术的算法原理、技术进展以及当前的落地应用。 一、图像分类算法 图像分类是指将输入的图像划分为…...

arm 下 多线程访问同一变量 ,使用原子操作 性能差问题

arm下原子操作性能差的原因 Linux Kernel(armv8-aarch64) 的原子操作的底层实现 - 极术社区 - 连接开发者与智能计算生态 arm 下如何解决 ARMs LSE (for atomics) and MySQL – MySQL On ARM – All you need to know about MySQL (and its variants) on ARM. arm 下lse 和…...

HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录 1.时钟选择(这里选择高速外部时钟) ​编辑 2.调试模式和时基源选择: 3.LED的GPIO配置 这里用板子的红灯PB5 4.工程配置 5.1ms的systick中断实现led闪烁 源码: 6.修改systick的中断频率 7.systick定时原理 SysTick 定时器的工作原理 中断触发机制 HAL_SYSTICK_Co…...

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;项目基本介绍 &#x1f6a6;项…...

亚远景-从SPICE到ASPICE:汽车软件开发的标准化演进

一、SPICE标准的起源与背景 SPICE&#xff0c;全称“Software Process Improvement and Capability dEtermination”&#xff0c;即“软件流程改进和能力测定”&#xff0c;是由国际标准化组织ISO、国际电工委员会IEC、信息技术委员会JTC1联合发起制定的ISO 15504标准。该标准旨…...

力扣1022. 从根到叶的二进制数之和(二叉树的遍历思想解决)

Problem: 1022. 从根到叶的二进制数之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 1.在先序遍历的过程中&#xff0c;用一个变量path记录并更新其经过的路径上的值&#xff0c;当遇到根节点时再将其加到结果值res上&#xff1b; 2.该题…...

Redis背景介绍

⭐️前言⭐️ 本文主要做Redis相关背景介绍&#xff0c;包括核心能力、重要特性和使用场景。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主…...

LabVIEW图像采集与应变场测量系统

开发了一种基于LabVIEW的图像采集与应变场测量系统&#xff0c;提供一种高精度、非接触式的测量技术&#xff0c;用于监测物体的全场位移和应变。系统整合了实时监控、数据记录和自动对焦等功能&#xff0c;适用于工程应用和科学研究。 项目背景 传统的位移和应变测量技术往往…...

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...

upload labs靶场

upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关&#xff0c;所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称&#xff1a;张嘉玮 二.解题情况 三.解题过程 题目&#xff1a;up load labs靶场 pass 1前后端 思路及解题&#xff1a;…...

自定义多功能输入对话框:基于 Qt 打造灵活交互界面

一、引言 在使用 Qt 进行应用程序开发时&#xff0c;我们经常需要与用户进行交互&#xff0c;获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具&#xff0c;可用于简单的输入场景&#xff0c;但当需求变得复杂&#xff0c;需要支持更多类型的输入控件&#xff0…...

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…...

JVM监控和管理工具

基础故障处理工具 jps jps(JVM Process Status Tool)&#xff1a;Java虚拟机进程状态工具 功能 1&#xff1a;列出正在运行的虚拟机进程 2&#xff1a;显示虚拟机执行主类(main()方法所在的类) 3&#xff1a;显示进程ID(PID&#xff0c;Process Identifier) 命令格式 jps […...

【TensorFlow】T1:实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据

说明&#xff1a; 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy&#xff08;好几年前的文章&#xff09;&#xff0c;从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy&#xff0c;需要注意不同版本对应的arcpy函数是存在差异的 数据准备&#xff1a;准备一…...

动静态库的学习

动静态库中&#xff0c;不需要包含main函数 文件分为内存级(被打开的)文件和磁盘级文件 库 每个程序都要依赖很多基础的底层库&#xff0c;本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被载入内存执行 静态库 linux .a windows .lib 动态库 linux .…...