我正在尝试了解所有权模型。由于Rust只能有一个所有者,这是否意味着不可能进行浅拷贝?是否有类似于浅表副本的内容?我猜您可以对引用做些什么,但这会迫使您使用其他类型?
答案 0 :(得分:8)
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);
}
当我们克隆greetings
时,实际上并没有克隆字符串。我们仅“克隆”引用(只是指针)。编译器在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);
}
当我们克隆greetings
时,Rc
对象也会被克隆。克隆Rc
时,引用计数器会增加,但Rc
管理的对象不会被克隆;相反,原始Rc
对象和克隆的String
对象都引用同一个getProductos() {
return of(this.productos.filter( el => el.categoria == 'a');
}
对象。