我正在努力了解所有权模式.由于Rust中只能有一个所有者,这是否意味着浅拷贝是不可能的?有没有类似于浅拷贝的东西?我猜你可以用引用做一些事情,但这会迫使你使用不同的类型?
Rust使用不同的类型来表示不同的所有权(单一所有权,共享所有权或借用).制作浅表副本意味着副本将与原始副本共享一些数据.这意味着我们必须使用支持共享的类型.
制作浅表副本的一种方法是复制共享引用.例如,考虑这个程序:
#[derive(Clone, Debug)]
struct Greetings<'a> {
hello: &'a str,
goodbye: &'a str,
}
fn main() {
let greetings = Greetings {
hello: "Hello!",
goodbye: "Goodbye!",
};
let new_greetings = greetings.clone();
println!("{:?}", new_greetings);
}
Run Code Online (Sandbox Code Playgroud)
当我们克隆时greetings,我们实际上并不克隆字符串; 我们只"克隆"引用(它们只是指针).编译器使用lifetime参数Greetings来确保实例Greetings不会超过存储在其中的字符串.
使浅表副本另一种方式是通过存储在一个拥有对象Rc或Arc智能指针和克隆该指针.例如:
use std::rc::Rc;
#[derive(Clone, Debug)]
struct Greetings {
hello: Rc<String>,
goodbye: Rc<String>,
}
fn main() {
let greetings = Greetings {
hello: Rc::new("Hello!".into()),
goodbye: Rc::new("Goodbye!".into()),
};
let new_greetings = greetings.clone();
println!("{:?}", new_greetings);
}
Run Code Online (Sandbox Code Playgroud)
克隆时greetings,Rc也会克隆对象.当Rc克隆一个时,引用计数器会递增,但是由它管理的对象Rc不会被克隆; 相反,原始Rc对象和克隆对象都引用同一个String对象.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |