惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
J
Java Code Geeks
小众软件
小众软件
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
A
About on SuperTechFans
Last Week in AI
Last Week in AI
Jina AI
Jina AI
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
美团技术团队
I
Intezer
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
T
Threatpost
P
Privacy International News Feed
Latest news
Latest news
K
Kaspersky official blog
博客园 - 聂微东
月光博客
月光博客
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
D
Docker
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 热门话题
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
Recent Announcements
Recent Announcements
T
Tenable Blog
B
Blog RSS Feed
Recorded Future
Recorded Future
雷峰网
雷峰网
SecWiki News
SecWiki News

博客园 - PKICA

博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 rust线程-std::thread::park和unpark 配合Builder实现轻量级的线程挂起与唤醒 rust自定义线程属性std::thread::Builder rust线程 rust关联函数 rust高并发设计实践进阶 rust高并发设计实践 rust性能优化与安全边界 联合体union在rust和C语言中有什么区别 rust并发与异步编程 如何预防rust不良的代码设计总结 rust类型系统与零成本抽象 rust内存模型 告别大显存依赖!用 Rust 新一代深度学习框架 Burn 打造纯 CPU 文本分类推理引擎 rust类型系统标记 编译配置解答 git实用命令 rust底层设计理念值得注意的几个地方总结 rust可变引用作为函数参数的机理详解 Rust内存重解释transmute C与Rust类型映射 Rust FFI 安全抽象范式 rust延迟初始化原语 rust重借用机制与原理 rust参数传递模型 汇编语言语法详解 gdb汇编调试 gdb-pwndbg的安装与使用指南 gdb调试插件gef C语言thread_local linux系统readelf命令使用指南 gcore转储进程内存 gdb查看命令 RGB与YUV颜色编码的区别 Rust原子类型 C++ STL求两个集合交集差集 gdb调试集锦 ubuntu24.0.4使用root用户登录 ubuntu24.0.4输入密码后跳回登录界面 AI内存压缩技术TurboQuant及存疑 ubuntu切换到指定内核版本 在没有顶级科技大佬直接背书的情况下deepseek为啥能够异军突起? HuggingFace和deepseek的关系 当前主流AI大模型
Rust写时克隆Cow系列2
PKICA · 2026-02-28 · via 博客园 - PKICA

细心的同学也许会发现,讲了Cow,那么Cow能够接受任意类型参数吗?咱先说答案,不可以。至于为什么呢?请同学们接着往下读。

在 Rust 中,Cow<'a, B>::Owned 变体接受的类型由泛型参数 B 决定,其约束规则非常明确:

1. 核心约束:ToOwned 关联类型

Cow::Owned 接受的数据类型必须是 B 类型关联的“拥有所有权”版本
具体语法定义如下:

pub enum Cow<'a, B> where B: 'a + ToOwned + ?Sized {
    Borrowed(&'a B),
    Owned(<B as ToOwned>::Owned), // 接受的就是这个类型
}

2. 常见匹配关系表

在实际开发中,最常与 Cow 搭配的类型如下:

借用类型 B (Borrowed)
Cow::Owned 接受的类型示例场景
str String 处理字符串,如 Cow<'static, str>
[T] (切片) Vec<T> 处理列表数据
Path PathBuf 处理文件路径
CStr CString 处理 FFI 中的 C 字符串
T (已实现 Clone) T 任何实现 Clone 的普通结构体

3. 为什么不直接接受任意类型?

Cow(Copy-on-Write)的设计初衷是在需要修改数据时能从借用态转换为拥有态

  • 如果你传入一个自定义类型 MyStruct 给 Cow::Owned,编译器要求必须存在一个对应的 B 类型,使得 B::to_owned() 能产生该 MyStruct
  • 通常对于普通的 Clone 类型,B 和 Owned 是同一种类型。 

4. 变体即函数语法回顾

正如之前提到的,Cow::Owned 本身也是一个构造函数。

let s = String::from("Hello");
// Cow::Owned 作为一个 fn(String) -> Cow<str> 的函数指针
let my_cow: Cow<str> = Cow::Owned(s); 

参考资料:

1.Rust写时克隆Cow

2.Rust枚举变体详解

3.rust语言泛型实现