总的来说,是否有一个枚举/特征用于拥有的值,因为当您不想指定该值的确切拥有方式(共享或不共享),而您只想拥有它时。
我需要将对闭包的引用存储在结构中,这意味着它们必须在结构存在的前提下生存。当然,我无法复制它们,因此它们需要作为引用。但是我不想做任何限制,因此结构的用户应该能够选择他们想要如何转移所有权。
当您无法复制值或它们真的很大时,这是一个普遍的问题。

非常一般的例子,我要寻找的是这个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>),
}

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

最佳答案

我认为您可能会对“owns”一词有些困惑,在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/

10-10 18:34