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 加入
一名修身养性的程序员

促进软件开发及相关领域知识与创新的传播
ArchSummit全球架构师峰会 3月24-25日
PCon全球产品创新大会 3月25-26日
DIVE全球基础软件创新大会 3月25-26日
ArchSummit全球架构师峰会 4月24-25日
QCon全球软件开发大会 5月12-14日
GMTC全球大前端技术大会 6月10-11日
ArchSummit全球架构师峰会 7月15-16日
PCon全球产品创新大会 8月19-20日
京公网安备 11010502039052号


评论