【问题标题】:How do you set the lifetime of a Rust trait?如何设置 Rust 特征的生命周期?
【发布时间】:2014-10-12 16:53:32
【问题描述】:

我可以在 struct Route 中设置 Waypoint 的生命周期。在结构 AMoreDifferentRoute 我使用特征 Coord 并得到错误

需要明确的生命周期限制

在这种情况下,您如何设置特征的生命周期?

extern crate collections;
use super::wp;
use coord::Coord;


pub struct Route<'a> {
    waypoints: &'a Vec<wp::Waypoint>
}

pub struct AMoreDifferentRoute<'a> {
    waypoints: &'a Vec<Coord>
}

【问题讨论】:

    标签: rust traits


    【解决方案1】:

    你把它写成一个额外的 trait bound:

    pub struct AMoreDifferentRoute<'a> {   // '
        waypoints: &'a Vec<Box<Coord+'a>>
    }
    

    您需要在Box&lt;Coord+'a&gt; 中指定生命周期,因为该特征可以为本身具有生命周期参数的结构实现,因此即使实际的结构类型隐藏在特征对象。

    此外,你不能有裸Coord,因为它的大小是未知的,因为Vec 需要知道它的组件大小才能将它们正确地布置在内存中。因此,您需要某种包装器来存储特征对象。 Box 会做得很好。

    【讨论】:

    • 我收到一个错误,core::kinds::Sized 不是由 coord::Coord+'a 实现的,这是 collections::vec::Vec 所要求的。例如waypoints: &amp;'a Vec&lt;Coord+ 'a&gt;
    • 对不起,当然会有错误。我应该提到,如果没有 Box 包装器,它将无法工作,因为裸 trait 类型没有大小并且不能存储在 Vec 中。
    • 您能解释一下Coord+ 'a 语法的含义吗?
    • @NicolasBonnefon,好吧,文中已经解释过了。这是“一种指定此生命周期的方法,即使结构类型隐藏在 trait 对象后面”。
    • @NicolasBonnefon,我已经稍微改写了答案,也许现在更清楚了。
    【解决方案2】:

    由于Coord 是一个特征,您需要以某种方式将值装箱为一个特征对象,例如Vec&lt;Box&lt;Coord&gt;&gt;

    您还应该认真考虑这是否真的是您想要的;很多时候不是。但要对此做出任何判断,我需要查看更多代码。

    【讨论】:

    • 我只是想收集一些实现 lat long 的东西。然后我可能会添加用于计算总距离等的函数。我希望订单是确定性的。
    猜你喜欢
    • 2022-08-22
    • 2013-07-03
    • 2019-02-24
    • 1970-01-01
    • 2015-04-22
    • 2017-11-08
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多