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

Blu*_*ber 1 ownership rust

我正在努力了解所有权模式.由于Rust中只能有一个所有者,这是否意味着浅拷贝是不可能的?有没有类似于浅拷贝的东西?我猜你可以用引用做一些事情,但这会迫使你使用不同的类型?

Fra*_*gné 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);
}
Run Code Online (Sandbox Code Playgroud)

当我们克隆时greetings,我们实际上并不克隆字符串; 我们只"克隆"引用(它们只是指针).编译器使用lifetime参数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);
}
Run Code Online (Sandbox Code Playgroud)

克隆时greetings,Rc也会克隆对象.当Rc克隆一个时,引用计数器会递增,但是由它管理的对象Rc不会被克隆; 相反,原始Rc对象和克隆对象都引用同一个String对象.