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

时间:2015-07-03 23:48:45

标签: 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>),
}

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

1 个答案:

答案 0 :(得分:3)

我认为你可能会被“#34;拥有&#34;”这个词绊倒,这在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,它也会拥有引用。但是,它不会拥有引用的项目。