1

我正在尝试使用生命周期参数来制作 a ,作为对( ) 和( ) 泛型参数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)

这个建议让我陷入了循环!

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

4

1 回答 1

1

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

由于生命周期仅用于默认参数,因此在这种情况下生命周期是多少:

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

?

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


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

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

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

于 2021-01-20T23:16:07.520 回答