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变量被丢弃,底层数据仍然有效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS配置邮件服务器给其他邮箱发邮件的方法

一、前言 公司系统用AWS平台的邮件服务器&#xff0c;如果想给新收件人发邮件&#xff0c;就需要特殊配置下才行&#xff1b;不然发不出去。 二、步骤 1.登录AWS平台&#xff0c;登录地址&#xff08;藏的很深&#xff0c;不太好搜到&#xff0c;参数也不能删&#xff09; …

kaggle视频行为分析1st and Future - Player Contact Detection

这次比赛的目标是检测美式橄榄球NFL比赛中球员经历的外部接触。您将使用视频和球员追踪数据来识别发生接触的时刻&#xff0c;以帮助提高球员的安全。两种接触&#xff0c;一种是人与人的&#xff0c;另一种是人与地面&#xff0c;不包括脚底和地面的&#xff0c;跟我之前做的这…

42【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式&#xff0c;由于跨域资源共享(cors)是浏览器的一种安全机制&#xff0c;它会阻止前端应用…

JVM执行流程与架构(对应不同版本JDK)

直接上图&#xff08;对应JDK8以及以后的HotSpot&#xff09; 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭&#xff1a; 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间&#xff0c;堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…

【玩转 Postman 接口测试与开发2_014】第11章:测试现成的 API 接口(下)——自动化接口测试脚本实战演练 + 测试集合共享

《API Testing and Development with Postman》最新第二版封面 文章目录 3 接口自动化测试实战3.1 测试环境的改造3.2 对列表查询接口的测试3.3 对查询单个实例的测试3.4 对新增接口的测试3.5 对修改接口的测试3.6 对删除接口的测试 4 测试集合的共享操作4.1 分享 Postman 集合…

登录认证(5):过滤器:Filter

统一拦截 上文我们提到&#xff08;登录认证&#xff08;4&#xff09;&#xff1a;令牌技术&#xff09;&#xff0c;现在大部分项目都使用JWT令牌来进行会话跟踪&#xff0c;来完成登录功能。有了JWT令牌可以标识用户的登录状态&#xff0c;但是完整的登录逻辑如图所示&…

基于Spring Security 6的OAuth2 系列之七 - 授权服务器--自定义数据库客户端信息

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

git基础使用--1--版本控制的基本概念

文章目录 git基础使用--1--版本控制的基本概念1.版本控制的需求背景&#xff0c;即为啥需要版本控制2. 集中式版本控制SVN3. 分布式版本控制 Git4. SVN和Git的比较 git基础使用–1–版本控制的基本概念 1.版本控制的需求背景&#xff0c;即为啥需要版本控制 先说啥叫版本&…

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …

课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究

无人机在现代航空、农业和监测等领域的应用日益广泛。为了提高导航精度&#xff0c;通常采用多传感器融合技术&#xff0c;将来自GPS、惯性测量单元&#xff08;IMU&#xff09;、磁力计等不同传感器的数据整合。然而&#xff0c;传感器的量测偏差、环境干扰以及非线性特性使得…

【MySQL】常用语句

目录 1. 数据库操作2. 表操作3. 数据操作&#xff08;CRUD&#xff09;4. 高级查询5. 索引管理6. 用户与权限7. 数据导入导出8. 事务控制9. 其他实用语句注意事项 如果这篇文章对你有所帮助&#xff0c;渴望获得你的一个点赞&#xff01; 1. 数据库操作 创建数据库 CREATE DATA…

基于多智能体强化学习的医疗AI中RAG系统程序架构优化研究

一、引言 1.1 研究背景与意义 在数智化医疗飞速发展的当下,医疗人工智能(AI)已成为提升医疗服务质量、优化医疗流程以及推动医学研究进步的关键力量。医疗 AI 借助机器学习、深度学习等先进技术,能够处理和分析海量的医疗数据,从而辅助医生进行疾病诊断、制定治疗方案以…

使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率

作者&#xff1a;来自 Elastic Jennie Davidowitz 在数字时代&#xff0c;州和地方政府越来越多地承担着管理大量数据的任务&#xff0c;同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异&#xff0c;通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…

【NLP 20、Encoding编码 和 Embedding嵌入】

目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码&#xff08;One-Hot Encoding&#xff09; (2) 位置编码&#xff08;Positional Encoding&#xff09; (3) 标签编码&#xff08;Label Encoding&#xff09; (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…

【Envi遥感图像处理】010:归一化植被指数NDVI计算方法

文章目录 一、NDVI简介二、NDVI计算方法1. NDVI工具2. 波段运算三、注意事项1. 计算结果为一片黑2. 计算结果超出范围一、NDVI简介 归一化植被指数,是反映农作物长势和营养信息的重要参数之一,应用于遥感影像。NDVI是通过植被在近红外波段(NIR)和红光波段(R)的反射率差异…

7、怎么定义一个简单的自动化测试框架?

定义一个简单的自动化测试框架可以从需求理解、框架设计、核心模块实现、测试用例编写和集成执行等方面入手&#xff0c;以下为你详细介绍&#xff1a; 1. 明确框架需求和范围 确定测试类型&#xff1a;明确框架要支持的测试类型&#xff0c;如单元测试、接口测试、UI 测试等…

web-XSS-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

Linux中的基本指令(二)

一、移动和重命名指令mv 1.1基本作用及使用规范 基本作用是进行文件的移动和重命名&#xff0c;使用规范如&#xff1a; mv src[目录/文件]dst[路径/文件] 回车 1.2三种不同的作用 通过在src部分和dst部分写入不同的内容&#xff0c;来实现文件的移动和重命名的等不同功能…

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…