由于Rust只能有一个所有者,这是否意味着不可能进行浅拷贝?

时间:2018-07-24 00:31:28

标签: rust ownership

我正在尝试了解所有权模型。由于Rust只能有一个所有者,这是否意味着不可能进行浅拷贝?是否有类似于浅表副本的内容?我猜您可以对引用做些什么,但这会迫使您使用其他类型?

1 个答案:

答案 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的实例不会超出存储在其中的字符串的寿命。

制作浅表副本的另一种方法是将拥有的对象存储在RcArc智能指针中并克隆该指针。例如:

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'); } 对象。