【问题标题】:Result with lifetime parameter - enum with lifetime parameter applied to default T<'a> and E<'a> parameter (Rust)具有生命周期参数的结果 - 具有生命周期参数的枚举应用于默认 T<'a> 和 E<'a> 参数 (Rust)
【发布时间】:2021-01-19 18:01:08
【问题描述】:

我正在尝试使用生命周期参数创建 Result,作为对 T (::Ok(T)) 和 E (::Err(E)) 通用参数的额外限制。

// enums A<'a> and B<'a> elided

pub enum Result<'a, T=A<'a>, E=B<'a>> {
    Ok(T),
    Err(E),
}

unused parameter, suggestion: add PhantomData

所以它没有工作。我读到我可以使用PhantomData 解决未使用的参数错误,但这对我来说似乎很脏。

这项工作也没有:

pub enum Result<T=A<'a>, E=B<'a>> {
    Ok(T),
    Err(E),
}

undefined parameter, suggestion: add parameter before T
(twice)

这个建议让我陷入了困境!

如何在我的enum 泛型参数默认值中放置一个带有生命周期参数的泛型type

【问题讨论】:

  • 如果您包含一些示例代码会有所帮助,这些代码会显示您正在尝试执行的操作的上下文。因为不清楚为什么不能使用标准Result,即返回类型为Result&lt;A&lt;'a&gt;, B&lt;'a&gt;&gt;
  • 可以使用别名代替默认类型:type MyResult&lt;'a&gt; = Result&lt;A&lt;'a&gt;, B&lt;'a&gt;&gt;;

标签: generics rust enums lifetime-scoping


【解决方案1】:

错误是正确的,这种类型没有意义:

由于生命周期仅用于默认参数,在这种情况下生命周期是什么:

let foo = Result::Ok(42); // What's the lifetime in this instance?

?

没有使用生命周期,这是错误消息的来源。


这个问题没有提供太多上下文,但您似乎打算只在您的类型中使用A&lt;'_&gt;B&lt;'_&gt;。如果是这种情况,那么您必须使用

pub enum Result<'a> {
    Ok(A<'a>),
    Err(B<'a>),
}

这是有效的。但是,这会引发一个问题,即为什么您不使用内置的 Result 类型,可能与类型别名结合使用以避免重复:type Result&lt;'a&gt; = std::result::Result&lt;A&lt;'a&gt;, B&lt;'a&gt;&gt;;。 这很常见,甚至标准库也会这样做几次:

【讨论】:

  • 谢谢!我正在为过长的Result 类型而苦苦挣扎,并且它没有“点击”我可以制作模块本地类型别名。我仍然想知道如何制作enum,其中TE 的生命周期始终相同,这样我就可以像let e = Result&lt;'a, A, B&gt; 一样构造enum 并让enum 的变体变为::T&lt;A&lt;'a&gt;&gt;::E&lt;B&lt;'a&gt;&gt;,但后来我意识到我没有实际需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2021-12-24
  • 1970-01-01
  • 2018-08-12
  • 2021-04-08
  • 2019-04-08
  • 2023-02-24
相关资源
最近更新 更多