






















细心的同学也许会发现,讲了Cow,那么Cow能够接受任意类型参数吗?咱先说答案,不可以。至于为什么呢?请同学们接着往下读。
在 Rust 中,Cow<'a, B>::Owned 变体接受的类型由泛型参数 B 决定,其约束规则非常明确:
ToOwned 关联类型Cow::Owned 接受的数据类型必须是 B 类型关联的“拥有所有权”版本。
具体语法定义如下:
pub enum Cow<'a, B> where B: 'a + ToOwned + ?Sized {
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned), // 接受的就是这个类型
}
在实际开发中,最常与 Cow 搭配的类型如下:
借用类型 B (Borrowed) | Cow::Owned 接受的类型 | 示例场景 |
|---|---|---|
Cow(Copy-on-Write)的设计初衷是在需要修改数据时能从借用态转换为拥有态。
MyStruct 给 Cow::Owned,编译器要求必须存在一个对应的 B 类型,使得 B::to_owned() 能产生该 MyStruct。Clone 类型,B 和 Owned 是同一种类型。 正如之前提到的,Cow::Owned 本身也是一个构造函数。
let s = String::from("Hello");
// Cow::Owned 作为一个 fn(String) -> Cow<str> 的函数指针
let my_cow: Cow<str> = Cow::Owned(s);
参考资料:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。