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

标签 rust ownership

我正在尝试了解所有权模型。由于 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);
}

当我们克隆 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 对象。

关于rust - 由于 Rust 中只能有一个所有者,这是否意味着浅拷贝是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51488888/

相关文章:

immutability - 在以下方法实现中,可变性如何影响 `self` 的生命周期?

rust - Rust 项目的推荐目录结构是什么?

rust - 如何从 rbtree-rs 插入或更新 RBTree?

rust - 在结构中移动一个盒子

rust - 如何在Rust中将借来的值保存到struct字段中

rust - 如何将数据从Array2 <f64>输入到kdtree?

string - 如何在 Rust 中将字符串转换为向量?

rust - 如何通过多个 Java 线程使用只读借用的 Rust 数据?

vector - 使用不可复制的移动值 [E0382] [E0277]