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
结构拥有一个装箱值向量,您可以在以后引用它。
关于reference - 如何创建带有引用向量的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191749/