如何使用引用向量创建结构?

时间:2016-03-24 01:30:06

标签: reference rust lifetime

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应该包含一个特征对象列表。它(据说)异构地保存任何实现提供的特征的类。据我了解,这意味着我必须使用引用,因此向量具有可用的实际大小。因为它是一个参考,所以必须在那里确保它们共同生存和死亡。

事情是,我知道什么是错的。在new中,Test属于new范围,我尝试将其引用传递给函数。如果我这样做,Test超出范围,参考不好。那我该怎么办?如何让对象持续Help的生命周期?毕竟,真的没有人拥有它。

此外,如果任何人一般都有关于如何从函数中返回引用的一般提示,我会很高兴听到它们。

编辑这与简单地传递对象的所有权不同;我不能这样做,因为向量需要引用而不是堆栈上的对象。西蒙的回答可能就是我正在寻找的东西 - 我忘记了我可以把这样的事情搞定。

1 个答案:

答案 0 :(得分:3)

您可能实际上并不希望将引用退出...但您可以将它们装箱并让它们拥有盒装值:

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 link