一般来说,对于拥有值是否存在枚举/特征,因为当您不想指定 的确切属性(共享与否)时,您只想拥有它。
我需要在结构中存储对闭包的引用,这意味着只要结构存在它们就必须存活。当然,我不能复制它们,所以它们需要被引用。但我不想制定限制,因此结构的用户应该能够选择他们想要转让所有权的方式
当您无法复制值或它们非常大时,这是一个普遍的问题。
非常一般的例子,我要找的是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>),
}
我希望我能解释一下我的意思。
答案 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
,它也会拥有引用。但是,它不会拥有引用的项目。