【问题标题】:How to apply a lifetime to VecDeque<Box<dyn Trait>>? [duplicate]如何将生命周期应用于 VecDeque<Box<dyn Trait>>? [复制]
【发布时间】:2020-02-17 01:53:00
【问题描述】:

我正在尝试创建一个 VecDeque 结构,它们都实现了 Animal 特征。此代码有效,但我不明白为什么添加 ' static 会修复它以及如何使它使用 'a 代替。

pub trait Animal {
    fn says(self) -> Option<String>;
}

use std::collections::VecDeque;

pub struct Zoo {
    list: VecDeque<Box<dyn Animal>>,
}

impl Zoo {
    pub fn new() -> Zoo {
        Zoo {
            list: VecDeque::new(),
        }
    }

    pub fn add<T>(&mut self, animal: T)
    where
        T: Animal + 'static,
    {
        self.list.push_back(Box::new(animal));
    }
}

两个问题:

  1. 谁能解释一下如何正确使用'a 以及它是如何工作的/这意味着什么?而且我猜为什么我什至需要在这里度过一生(是因为我使用的是 Box)?
  2. 我也很困惑为什么我必须使用#[path="..."],因为没有它,它会要求我将文件移动到src/lib/animal.rs,但是当我移动它时,它仍然不起作用。

【问题讨论】:

  • play.rust-lang.org/…,但我不知道这样做是否有意义
  • @Stargateur 太棒了,你修复了它,我现在可以编译了 :) 非常感谢你抽出宝贵的时间!关于它是如何工作的以及为什么它比静态更好,是否有一些基本逻辑?你还说你不知道这样做是否有意义,这不是最好的路线还是有其他原因?
  • @John Box&lt;dyn Animal&gt; 在此上下文中等于 Box&lt;dyn Animal + 'static&gt;。因此,您放入 VecDeque 的任何内容都必须是 'static - 这就是您在 add 方法的 where 子句中添加 'static 绑定的原因。 'static 限制了您可以放入 Zoo 的内容,只有其中没有引用(或带有 'static 引用)的对象才是 'static 本身。
  • @John 那么#[path="..."],你违反了关于项目结构的约定。以下是相关文档:doc.rust-lang.org/book/…
  • 感谢您关注@L117。关注doc.rust-lang.org/book/… 我仍然无法正常工作。它要求我在src/lib/front_of_house.rs 中创建一个文件,而不是在src/front_of_house.rs 中,正如指南所建议的那样。我正在使用 2018 版,无法弄清楚我做错了什么。

标签: rust trait-objects


【解决方案1】:

正如已经指出的,Box&lt;dyn Animal&gt; 等价于Box&lt;dyn Animal + 'static&gt;,这意味着指向在整个程序中有效的东西(如字符串文字)的指针。这可能不是你想要的。

您希望您的Zoo 的寿命不能超过您的Animals。 (这是编译器将强制执行的)。所以你用生命周期 'a 注释 Zoo 并且你要求存储在 Zoo 中的每个 Animal 的生命周期至少与 'a 一样长:

pub struct Zoo<'a> {
    animals: VecDeque<Box<dyn Animal + 'a>>,
}   

编译器将检查您的生命周期注释是否有意义,并强制引用不能超过对象。

【讨论】:

  • 知道了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2023-04-01
相关资源
最近更新 更多