【问题标题】:Rust - Enum variant that references a structRust - 引用结构的枚举变体
【发布时间】:2020-12-08 00:10:36
【问题描述】:

我是生锈的新手。我有这个代码:

enum Foo {
    F1 { x: Vec<Foo>, y: i32 },
    F2 { x: &Bar },
}

struct Bar {
    x: i32,
    y: Vec<Foo>,
}

显然,这不会编译,因为我必须给出一个生命周期参数,这会导致:

enum Foo<'a> {
    F1 { x: Vec<Foo<'a>>, y: i32 },
    F2 { x: &'a Bar<'a> },
}

struct Bar<'a> {
    x: i32,
    y: Vec<Foo<'a>>,
}

像这样使用生命周期是一种好习惯吗?在这种情况下,我需要 F2 来引用 Bar

【问题讨论】:

  • 我不确定我是否理解您所说的最佳实践是什么意思。是否需要引用取决于场景,对吗?如果你的结构中有引用,那么生命周期仍然存在。只是有时由于终身省略,您不需要指定它们。如果您愿意,您可以在每个引用上指定生命周期参数。

标签: struct rust enums lifetime


【解决方案1】:

您编写的生命周期注释适合这种情况。 (在其他情况下,最好使用多个生命周期参数,例如在处理 &amp;mut 引用时,以避免过度约束生命周期,但情况并非如此。)

但是,可能您实际上根本不想使用&amp;Bar,而是拥有Bar 的其他类型,例如Box&lt;Bar&gt;Rc&lt;Bar&gt;结构。在这种情况下,您将不需要生命周期注释。是否是这种情况取决于这些结构的构造和使用方式,因此不能仅从类型声明中确定——但如果是这样,您会在尝试使用它们时通过编译错误发现。

【讨论】:

  • 感谢您的快速回答。从长远来看,这会是一个好习惯吗(因为我在Foo 中添加了更多类似的枚举变体并更多地使用枚举)?
  • @xilpex 要回答“这是否是一种好的做法”,需要考虑一些替代方案,并且没有足够的上下文背景,因为您已经非常笼统地写了您的问题,以描述任何足以引起兴趣的不同之处(例如使用不同的数据结构)。
猜你喜欢
  • 2023-01-03
  • 2015-01-12
  • 2021-06-05
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多