写点什么

Rust 的 Cow 类型

作者:Shine
  • 2022 年 3 月 22 日
  • 本文字数: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);
复制代码


用户头像

Shine

关注

万物负阴而抱阳,冲气以为和 2017.11.23 加入

一名修身养性的程序员

评论

发布
暂无评论
Rust的Cow类型_rust_Shine_InfoQ写作平台