rust - 拥有一个值的一般方式(不要指定 `Rc` 或 `Box` )

标签 rust ownership

一般来说,是否有一个用于拥有值的枚举/特征,当您不想指定如何确切地拥有该值(共享与否),但您只想拥有它。
我需要在结构中存储对闭包的引用,这意味着它们必须与结构存在的时间一样长。当然,我无法复制它们,所以它们需要作为引用。但我不想做限制,所以结构的用户应该能够选择他们想要如何转移所有权。
当您无法复制值或值非常大时,这是一个普遍问题。

很一般的例子,我要找的是这个Owned<T>

struct Holder<T> {
    value: Owned<T>,
}

...

let rc = Rc::new(variable);
let holder = Holder::new(rc.clone());
let holder2 = Holder::new(Box::new(variable2));

这种类型的一个非常简单的“实现”的例子是:

enum Owned<T> {
     Unique(Box<T>),
     Shared(Rc<T>),
}

我希望我能解释一下我的意思。

最佳答案

我想你可能对“拥有”这个词有点迷惑,这在 Rust 中是可以理解的!每个值都属于某物,但有时该值指的是您不拥有的东西。

在您的情况下,您只需要接受一个T。然后 Holder 将拥有 T:

use std::rc::Rc;

struct Holder<T> {
    value: T,
}

impl<T> Holder<T> {
    fn new(v: T) -> Holder<T> {
        Holder { value: v }
    }
}

fn main() {
    let variable = "Hello world".to_owned();
    let variable2 = "Hello moon".to_owned();

    let rc = Rc::new(variable);
    let holder = Holder::new(rc.clone());
    let holder2 = Holder::new(Box::new(variable2));
}

即使您将引用传递给 Holder,它也将拥有引用。但是,它不会拥有所引用的项目。

关于rust - 拥有一个值的一般方式(不要指定 `Rc` 或 `Box` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31215418/

相关文章:

rust - Rust 中的 move 语义是什么?

rust - Rust中的“cannot return value referencing temporary value”和内部可变性

C++ - 可以在同一个类中拥有或共享的对象

rust - 如何说服借用检查器不再使用借用的引用

makefile - 对 '_Unwind_GetIP' 的 undefined reference

rust - 字符串串联在使用rust 和借用中

mysql - 为什么 rustc 没有将 libmariadb 包含到发布二进制文件中?

rust - 引用枚举中的参数

reference - 我可以将局部变量的所有权和对它们的引用转移到返回的迭代器吗?

shell - 为什么 compgen 命令在 Linux 终端中有效,但在 process::Command 中无效?