结论:Cow<'a, B> 是"借用或拥有"二选一枚举(Borrowed(&'a B) / Owned(B::Owned)),用于"多数时候只读借用、偶尔需要修改并拥有"的场景,读路径零拷贝,写时才克隆,典型如 String/str、Path 处理。
展开:经典案例是字符串清洗函数:输入没有非法字符时直接返回借用的 &str(零分配),需要替换时才构造新 String。标准库 String::from_utf8_lossy 就返回 Cow<str>——合法 UTF-8 直接借用,含非法字节才生成替换后的新串。约束:Cow 借用了输入数据,生命周期不能超过来源;要长期持有需调 .into_owned()。易错点:Cow 的 Deref 指向 B,修改要走 to_mut()(此时若是 Borrowed 才克隆),不要误以为拿到 Cow 就能原地改。
use std::borrow::Cow;
fn sanitize(input: &str) -> Cow<'_, str> {
if input.contains('<') {
Cow::Owned(input.replace('<', "<"))
} else {
Cow::Borrowed(input) // 零拷贝
}
}
追问方向:与 Option<String> 方案的比较、Cow 在反序列化(serde #[serde(borrow)])中的应用。