发现一个 Cow 用处,可以让变量支持同时赋值引用类型和值类型,场景就是我们可能接收到一个引用,同时可能需要把它变成值类型做一些处理,我们可以通过 clone
或 to_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) {
}