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

rust语言学习笔记Trait(十三)Borrow、BorrowMut(借用)

BorrowBorrowMut是 Rust 标准库中用于抽象‌借用行为‌的两个核心 trait,位于std::borrow模块。它们为类型系统提供了一种“可以通过引用访问底层数据”的通用契约,尤其适合泛型编程和集合类型的键查找场景。‌

1、Borrow不可变借用

(1)定义

pubtraitBorrow<Borrowed:?Sized>{fnborrow(&self)->&Borrowed;}

Borrow<Borrowed>表示“当前类型可以被不可变地借用为&Borrowed”。

  • String实现了Borrow<str>,即String可以借用为&str
  • Vec<T>实现了Borrow<[T]>,即Vec<T>可以借用为&[T]
  • Box<T>实现了Borrow<T>,即Box<T>可以借用为 `&T

(2)核心特点:语义等价保证

Borrow有一个‌文档规定的契约‌:如果类型T实现了Borrow<U>,那么T的借用结果&U必须在EqOrdHash这些 trait 上与T自身保持行为一致。也就是说,‌借用前后的值是语义等价的‌。

这一约束是BorrowAsRef最本质的区别。AsRef只关注类型转换本身,不关心相等性、哈希值等语义是否一致;而Borrow明确要求这种一致性。

(3)为什么是泛型 Trait?

一个类型可能需要被借用为多种形式。例如String

  • 实现了Borrow<str>(借用为字符串切片)
  • 通过 blanket impl 自动实现了Borrow<String>(借用为自身)

这种泛型设计让同一种类型能以不同的“视角”被安全借用,极大提升了 API 的灵活性。

2、BorrowMut可变借用

(1)定义

rustpub trait BorrowMut<Borrowed: ?Sized>: Borrow<Borrowed> { fn borrow_mut(&mut self) -> &mut Borrowed; }

BorrowMutBorrow的可变版本,并且‌**自动继承了Borrow**‌。它允许通过可变引用获取底层数据的可变借用。

(2)常见实现

  • &mut T实现BorrowMut<T>
  • Vec<T>实现BorrowMut<[T]>
  • RefCell<T>实现BorrowMut<T>(在运行时检查借用规则)

3、HashMap等集合的异构键查找(Borrow的核心用途)

HashMap::get的签名

pubfnget<Q:?Sized>(&self,k:&Q)->Option<&V>whereK:Borrow<Q>,Q:Hash+Eq,{self.base.get(k)}

这里的K: Borrow<Q>保证了键类型K(如String)可以被借用为查询类型Q(如str),并且两者的HashEq实现是兼容的,从而确保通过&str计算出的哈希桶与插入时通过String计算出的哈希桶完全一致。

usestd::collections::HashMap;fnmain(){letmutm=HashMap::new();m.insert("aaa".to_string(),111);println!("{:?}",m.get("aaa"));// Some(111)}

同样的机制也适用于BTreeMapHashSetBTreeSet等标准库集合类型。

4、泛型函数参数的类型扩展

当函数需要接受多种“可借用为某类型”的参数时,Borrow可以完美胜任:

usestd::borrow::Borrow;fnprint_info<T:Borrow<str>>(s:T){letst=s.borrow();// &strprintln!("{}",st);}fnmain(){print_info("aaaaa");// &strprint_info(String::from("bbbbb"));// Stringprint_info(std::borrow::Cow::Borrowed("ccc"));// Cow<str>}

函数只需要一个实现,就能同时接受&strStringCow<str>等多种类型,且所有类型在Hash/Eq/Ord上的行为保持一致。

5、自定义类型的语义借用

当自定义类型包装了某个值,且希望它在集合中表现得如同底层类型一样时,可以实现Borrow

usestd::borrow::Borrow;usestd::collections::HashSet;usestd::hash::Hash;#[derive(PartialEq, Eq, Hash)]structMyStruct(String);implBorrow<str>forMyStruct{fnborrow(&self)->&str{&self.0}}fnmain(){letmuts=HashSet::new();s.insert(MyStruct("aaeeaa".to_string()));println!("{}",s.contains("aaeeaa"));}

6、BorrowMut在可变上下文中的应用

当需要泛型地修改包装类型的内部值时:

usestd::borrow::BorrowMut;fnmy_fn<T:BorrowMut<i32>>(s:&mutT){*s.borrow_mut()+=2;}fnmain(){letmuta=6;my_fn(&muta);println!("{}",a);// 8letmutb=Box::new(15);my_fn(&mutb);println!("{}",*b);// 17}

函数不关心传入的是&mut i32还是Box<i32>,只要它能通过BorrowMut<i32>提供对i32的可变引用即可。

7、BorrowvsAsRef的选择指南

维度BorrowAsRef
语义保证要求借用值与原值在Eq/Hash/Ord上等价仅做类型转换,无语义保证
主要用途集合键查找、需要语义等价的场合简单的引用转换、文件路径处理
典型场景HashMap::getBTreeMap键查询File::open、接受Path参数的函数
实现约束需确保x.borrow() == y.borrow()当且仅当x == y无此约束

简单记忆‌:涉及集合查找、比较、哈希等价时用Borrow;仅是类型转换、路径处理等用AsRef

http://www.jsqmd.com/news/904507/

相关文章:

  • BEYOND Expo 2026聚焦AI数实共生:硬件爆发门槛在哪,产品力才是关键!
  • 工程效率到边际成本:解析企业级 AI 路由层如何实现高效工具链平替
  • 2026杭州新房除醛全攻略:Top5机构深度测评与优选榜单 - 绿舒环保母婴除甲醛
  • Sora 2企业形象片从0到1交付全流程:3小时极速成片、92%客户复购率背后的7个工业级参数配置
  • 三亚本地黄金回收靠谱门店推荐 长悦福正美满运福昌夏千金典藏六家实体服务解读 - 专业黄金回收
  • AMD锐龙平台福音:保姆级VMware 16安装macOS BigSur避坑全记录(附资源)
  • 内存补丁技术深度解析:企业级即时通讯消息保留解决方案
  • IEA-15-240-RWT:15MW海上参考风力涡轮机完整开源模型深度解析
  • 消费级机器人爆发:技术、供应链与需求驱动,未来机会几何?
  • 深入拆解:从 TCP 状态机到 HTTP/3 拥塞控制的底层演进
  • 深度解析怡南铜业TOPPO:慢走丝电极线核心技术与高端制造应用 - 速递信息
  • 2026企业消费者调研实战指南:助力品牌读懂用户心声 - 调研分享家
  • 抖音直播数据分析终极指南:零代码获取实时弹幕的完整教程
  • 深入拆解 MySQL 锁机制:全局锁、表级锁、行级锁实战全解析
  • 保姆级教程:手把手教你将IMU(以TL740D为例)接入Cartographer,搞定Lidar+IMU融合建图
  • AI视角下的内存设计最佳实践:从原理到高性能系统应用
  • 佛山阻燃环保吸音板企业排行:实力品牌全解析 - 奔跑123
  • 【反封禁策略】集成 Undetected-Chromedriver:让 Browser-Use 绕过 Cloudflare 五秒盾
  • 3种方法实现Switch游戏画面电脑同步:SysDVR开源神器完全指南
  • 温州黄金回收哪家最靠谱?2026全城实测正规上门回收门店榜单鹿城 / 瓯海 / 龙湾 / 瑞安 / 乐清 / 洞头(温州全区域可上门) - 速递信息
  • AI Agent平台安全配置自动化扫描工具AISecScan的设计与实践
  • 常德黄金回收六家老店实测对比 本地人卖金先看这篇 - 专业黄金回收
  • BsMax:让Blender成为你最熟悉的创作伙伴
  • 想定制泵阀行业询盘 + 零售 一站全搞定跨境营销站怎么挑选服务商? WaiMaoYa 外贸鸭深耕外贸建站多年 - 外贸独立站运营
  • 开源LCA工具openLCA:5步快速掌握生命周期评估核心技能
  • 7个月估值从40亿到150亿美元,Fireworks AI如何成为AI推理赛道“卖水人”?
  • 如何在5分钟内让Windows 11运行如新:开源工具Win11Debloat终极指南
  • ChanlunX:三步实现通达信缠论分析的终极自动化方案
  • 中级经济师在职学习为什么需要答疑服务? - 众智商学院官方
  • Mask R-CNN、PointNet++、LiDAR-Camera Fusion:盘点那些年水果采摘机器人用过的CV模型