发现一个 Cow 用处,可以让变量支持同时赋值引用类型和值类型,场景就是我们可能接收到一个引用,同时可能需要把它变成值类型做一些处理,我们可以通过 cloneto_owned 统一变成值类型:

fn maybe_need_to_change(s: &str) {
    let s = if s.starts_with("xxx") {
        manipulate(s)
    } else {
        s.to_owned() // 存在额外的开销
    };

    take_reference(&s);

    // s.into_owned() 可以得到 String 类型的值
}

fn manipulate(s: &str) -> String {
    s.to_owned()
}

fn take_reference(s: &str) {

}

另外一种方式就是通过 Cow 避免不必要的 clone 开销:


fn maybe_need_to_change(s: &str) {
    let s = if s.starts_with("xxx") {
        Cow::from(manipulate(s))
    } else {
        Cow::from(s) // 没有额外的开销
    };

    take_reference(&s);
}

fn manipulate(s: &str) -> String {
    s.to_owned()
}

fn take_reference(s: &str) {

}