如何创建一个包含引用向量的结构体?

8
Rust似乎是一种很优秀的语言-我应该知道与编译器的斗争是代价。我试图为一个结构体创建一个构造函数,但是我得到了“does not live long enough”错误。
简化到最基本,我有:
fn main() {
    println!("RUST PLEASE");
}

struct Help<'a> {
    list: Vec<&'a Traits>
}

impl<'a> Help<'a> {
    fn new() -> Help<'a> {
        Help { list: vec![&Test] }
    }
}

trait Traits {
    fn mice(&self);
}

struct Test;
impl Traits for Test {
    fn mice(&self) { print!("WHY"); }
}

所以,我这样做是因为那个向量 list 应该保存一个实现提供的 trait 的任何类的异构列表。据我所知,这意味着我必须使用引用,以便向量具有实际大小可用。由于它是引用,生命周期必须存在,以确保它们一起生存和死亡。
问题是,我知道哪里出了问题。在 new 中,那个 Test 属于 new 作用域,我试图将其引用传递到函数的上方和外部。如果我这样做,Test 就会超出作用域,引用就会失效。那我该怎么办?如何让对象持续 Help 的生命时间?毕竟,没有人真正拥有它。
另外,如果有人对如何一般性地从函数中返回引用有什么建议,我会很高兴听到他们的意见。 编辑 这与仅仅传递对象的所有权不同;我不能这样做,因为向量需要引用而不是堆栈中的对象。Simon 的答案可能是我要找的 - 我已经忘记我可以将东西包装起来。

可能是 Expanding Rust Lifetime 的重复问题。 - Lukas Kalbertodt
1个回答

6

你可能并不希望返回引用... 但是你可以将它们装箱(box)起来,让它们拥有装箱后的值:

fn main() {
    println!("RUST PLEASE");
}

struct Help {
    list: Vec<Box<Traits>>
}

impl Help {
    fn new() -> Help {
        Help { list: vec![Box::new(Test)] }
    }
}

trait Traits {
    fn mice(&self);
}

struct Test;
impl Traits for Test {
    fn mice(&self) { print!("WHY"); }
}

您的Help结构体现在拥有一个装箱值的向量,您可以在以后引用它们。

Playpen 链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接