Rust 的 Cow 类型
Cow 是一种提供 Clone on Write 功能的枚举类型。Cow 实质上是一种智能指针,读取其中封装数据时,返回的是共享引用;当要修改它或获取所有权时,实行数据的克隆。
Cow 类型声明如下
复制代码
Cow 依靠实现Deref
trait 获得被封装数据的共享引用。如果要修改被封装的数据,它的to_mut
方法将获得拥有数据的引用(没有拥有数据的话会克隆原始数据)。
复制代码
本文字数:518 字
阅读完需:约 2 分钟
Cow 是一种提供 Clone on Write 功能的枚举类型。Cow 实质上是一种智能指针,读取其中封装数据时,返回的是共享引用;当要修改它或获取所有权时,实行数据的克隆。
Cow 类型声明如下
pub enum Cow<'a, B>
where
B: 'a + ToOwned + ?Sized,
{
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}
Cow 依靠实现Deref
trait 获得被封装数据的共享引用。如果要修改被封装的数据,它的to_mut
方法将获得拥有数据的引用(没有拥有数据的话会克隆原始数据)。
use std::borrow::Cow;
fn abs_all(input: &mut Cow<[i32]>) {
for i in 0..input.len() {
let v = input[i];
if v < 0 {
// 此时如果input还没有拥有vector, 就会克隆原来的数据到input.
input.to_mut()[i] = -v;
}
}
}
// 不会发生克隆,因为input没有被修改.
let slice = [0, 1, 2];
let mut input = Cow::from(&slice[..]);
abs_all(&mut input);
// 会发生克隆,因为input有负值,会被修改
let slice = [-1, 0, 1];
let mut input = Cow::from(&slice[..]);
abs_all(&mut input);
// 不会发生克隆,因为input已经拥有了数据
let mut input = Cow::from(vec![-1, 0, 1]);
abs_all(&mut input);
万物负阴而抱阳,冲气以为和 2017.11.23 加入
一名修身养性的程序员
促进软件开发及相关领域知识与创新的传播
评论