本文简要介绍rust语言中 Trait std::clone::Clone
的用法。
用法
pub trait Clone {
fn clone(&self) -> Self;
fn clone_from(&mut self, source: &Self) { ... }
}
显式复制对象的能力的共同特征。
与 Copy
的不同之处在于, Copy
是隐式的,并且是廉价的按位复制,而 Clone
始终是显式的,可能很昂贵,也可能不昂贵。为了强制执行这些特性,Rust 不允许您重新实现 Copy
,但您可以重新实现 Clone
并运行任意代码。
由于 Clone
比 Copy
更通用,因此您也可以自动将任何东西 Copy
设为 Clone
。
可导出的
如果所有字段都是 Clone
,则此特征可以与 #[derive]
一起使用。 Clone
的 derive
d 实现在每个字段上调用 clone
。
对于泛型结构,#[derive]
通过在泛型参数上添加绑定 Clone
有条件地实现 Clone
。
// `derive` implements Clone for Reading<T> when T is Clone.
#[derive(Clone)]
struct Reading<T> {
frequency: T,
}
如何实现 Clone
?
Copy
的类型应该有一个简单的 Clone
实现。更正式地说:如果 T: Copy
、 x: T
和 y: &T
,则 let x = y.clone();
等价于 let x = *y;
。手动实现应该小心维护这个不变量;但是,不安全的代码不能依赖它来确保内存安全。
一个示例是包含函数指针的通用结构。在这种情况下,Clone
的实现不能是derive
d,而是可以实现为:
struct Generate<T>(fn() -> T);
impl<T> Copy for Generate<T> {}
impl<T> Clone for Generate<T> {
fn clone(&self) -> Self {
*self
}
}
其他实现者
除了下面列出的实现者之外,以下类型还实现 Clone
:
- 函数项类型(即为每个函数定义的不同类型)
- 函数指针类型(例如,
fn() -> i32
) - 元组类型,如果每个组件也实现
Clone
(例如,()
,(i32, bool)
) - 闭包类型,如果它们没有从环境中捕获任何值,或者所有这些捕获的值都实现了
Clone
。请注意,共享引用捕获的变量始终实现Clone
(即使引用对象没有),而可变引用捕获的变量从不实现Clone
。
相关用法
- Rust Clone.clone用法及代码示例
- Rust CStr.into_c_string用法及代码示例
- Rust Cursor.new用法及代码示例
- Rust Condvar.notify_all用法及代码示例
- Rust Cursor.remaining_slice用法及代码示例
- Rust Command.args用法及代码示例
- Rust Condvar.wait用法及代码示例
- Rust Chars.as_str用法及代码示例
- Rust CString.into_bytes用法及代码示例
- Rust CStr.from_bytes_with_nul用法及代码示例
- Rust Cow.is_owned用法及代码示例
- Rust Cow用法及代码示例
- Rust Condvar.wait_timeout用法及代码示例
- Rust Condvar.wait_timeout_while用法及代码示例
- Rust Command.env用法及代码示例
- Rust CStr.from_bytes_with_nul_unchecked用法及代码示例
- Rust Command.env_remove用法及代码示例
- Rust Child用法及代码示例
- Rust Command.get_args用法及代码示例
- Rust Command.stdout用法及代码示例
- Rust Chain.get_ref用法及代码示例
- Rust Cursor.position用法及代码示例
- Rust Cell.as_slice_of_cells用法及代码示例
- Rust Command.stdin用法及代码示例
- Rust Components用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::clone::Clone。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。