【问题标题】:How to create a struct with a vector of references?如何使用引用向量创建结构?
【发布时间】:2016-03-24 01:30:05
【问题描述】:

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 的生命周期?毕竟,真的没有人拥有它。

另外,如果有人对如何从函数中返回引用有任何一般性的提示,我会很高兴听到这些提示。

EDIT 这与简单地传递对象的所有权不同;我不能这样做,因为向量 需要 引用而不是堆栈上的对象。西蒙的答案可能就是我正在寻找的——我忘记了我可以像这样把东西装箱。

【问题讨论】:

标签: reference rust lifetime


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-01-26
    • 2022-11-22
    相关资源
    最近更新 更多