Enum alloc::borrow::Cow 1.0.0[−][src]
pub enum Cow<'a, B: ?Sized + 'a> where
B: ToOwned, {
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}
Expand description
写时克隆智能指针。
Cow
类型是一种智能指针,提供了写时克隆功能:它可以封装并提供对借用数据的不可变访问,并在需要可变的或所有权时懒惰地克隆数据。
该类型旨在通过 Borrow
trait 处理常规借用数据。
Cow
实现了 Deref
,这意味着您可以直接在它包含的数据上调用非可变方法。
如果需要进行可变的,则 to_mut
将获得一个拥有值的变量引用,必要时进行克隆。
如果需要引用计数指针,请注意 Rc::make_mut
和 Arc::make_mut
也可以提供写时克隆功能。
Examples
use std::borrow::Cow;
fn abs_all(input: &mut Cow<[i32]>) {
for i in 0..input.len() {
let v = input[i];
if v < 0 {
// 如果尚未拥有,则克隆到 vector 中。
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);
Run另一个示例显示如何将 Cow
保留在结构体中:
use std::borrow::Cow;
struct Items<'a, X: 'a> where [X]: ToOwned<Owned = Vec<X>> {
values: Cow<'a, [X]>,
}
impl<'a, X: Clone + 'a> Items<'a, X> where [X]: ToOwned<Owned = Vec<X>> {
fn new(v: Cow<'a, [X]>) -> Self {
Items { values: v }
}
}
// 根据切片的借用值创建容器
let readonly = [1, 2];
let borrowed = Items::new((&readonly[..]).into());
match borrowed {
Items { values: Cow::Borrowed(b) } => println!("borrowed {:?}", b),
_ => panic!("expect borrowed value"),
}
let mut clone_on_write = borrowed;
// 将切片中的数据可变的为拥有的 vec,并在顶部推入新值
clone_on_write.values.to_mut().push(3);
println!("clone_on_write = {:?}", clone_on_write.values);
// 数据被可变的。让我们来看看。
match clone_on_write {
Items { values: Cow::Owned(_) } => println!("clone_on_write contains owned data"),
_ => panic!("expect owned data"),
}
RunVariants
Borrowed(&'a B)
Tuple Fields
0: &'a B
借用的数据。
Owned(<B as ToOwned>::Owned)
拥有的数据。
Implementations
提取拥有的数据。
如果数据尚未拥有,则克隆数据
Examples
在 Cow::Borrowed
上调用 into_owned
会克隆底层数据并成为 Cow::Owned
:
use std::borrow::Cow;
let s = "Hello world!";
let cow = Cow::Borrowed(s);
assert_eq!(
cow.into_owned(),
String::from(s)
);
Run禁止在 Cow::Owned
上调用 into_owned
:
use std::borrow::Cow;
let s = "Hello world!";
let cow: Cow<str> = Cow::Owned(String::from(s));
assert_eq!(
cow.into_owned(),
String::from(s)
);
RunTrait Implementations
执行 +=
操作。 Read more
执行 +=
操作。 Read more
用一个元素扩展一个集合。
将 Cow<'_, [T]>
转换为 Box<[T]>
当 cow
是 Cow::Borrowed
变体时,此转换在堆上分配并复制底层切片。
否则,它将尝试重用拥有所有权的 Vec
的分配。
将 Cow<'_, str>
转换为 Box<str>
当 cow
是 Cow::Borrowed
变体时,此转换在堆上分配并复制底层 str
。
否则,它将尝试重用拥有所有权的 String
的分配。
Examples
use std::borrow::Cow;
let unboxed = Cow::Borrowed("hello");
let boxed: Box<str> = Box::from(unboxed);
println!("{}", boxed);
Runlet unboxed = Cow::Owned("hello".to_string());
let boxed: Box<str> = Box::from(unboxed);
println!("{}", boxed);
Run如果存在,则此方法返回 self
和 other
值之间的顺序。 Read more