结论:Cow<'a, B> 是"借用或拥有"二选一枚举(Borrowed(&'a B) / Owned(B::Owned)),用于"多数时候只读借用、偶尔需要修改并拥有"的场景,读路径零拷贝,写时才克隆,典型如 String/strPath 处理。

展开:经典案例是字符串清洗函数:输入没有非法字符时直接返回借用的 &str(零分配),需要替换时才构造新 String。标准库 String::from_utf8_lossy 就返回 Cow<str>——合法 UTF-8 直接借用,含非法字节才生成替换后的新串。约束:Cow 借用了输入数据,生命周期不能超过来源;要长期持有需调 .into_owned()。易错点:CowDeref 指向 B,修改要走 to_mut()(此时若是 Borrowed 才克隆),不要误以为拿到 Cow 就能原地改。

use std::borrow::Cow;
fn sanitize(input: &str) -> Cow<'_, str> {
    if input.contains('<') {
        Cow::Owned(input.replace('<', "&lt;"))
    } else {
        Cow::Borrowed(input) // 零拷贝
    }
}

追问方向:与 Option<String> 方案的比较、Cow 在反序列化(serde #[serde(borrow)])中的应用。