reference - 如何创建带有引用向量的结构?

标签 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 的生命周期内持续存在?毕竟,真的没有人拥有它。

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

编辑 这与简单地放弃对象的所有权不同;我不能那样做,因为向量需要 一个引用而不是堆栈上的一个对象。 Simon 的答案可能正是我要找的 - 我忘记了我可以像那样把东西装箱。

最佳答案

您可能实际上不想返回引用...但您可以将它们装箱并让它们拥有装箱的值:

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

关于reference - 如何创建带有引用向量的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191749/

相关文章:

c# - 从表中获取值作为引用

Rust 在 String.split 之后使用链

timer - Rust 是否有 Python 的 threading.Timer 的等价物?

Rust MemWriter 返回指向 Buffer 的指针

reference - 循环中的可变借用

c++ - 通过引用传递 - 左值和 vector

c++ - MSVC 2017 违反单个翻译单元内的静态初始化顺序

function - 来自报告函数的 SSRS 引用报告变量

generics - 对位向量使用泛型时,不能应用二元运算 !=

multithreading - 为什么局部变量对于 thread::scoped 的生存时间不够长?