每晚的使用寿命不受限制,需要设计建议

che*_*eme 5 lifetime rust

我对某些代码有点困惑,http://is.gd/OMvnN7:每晚的错误修复使其无效(有充分的理由:https://github.com/rust-lang/rust/pull/24461) ,但我没有看到任何替代方法可以让我的代码运行。

关键是我的关联类型“SignedContent”大多数时候都有一个关联的生命周期,但我不想将此生命周期绑定到其父特征(对现有代码的影响可能是每个使用此特征的特征(很多) )将需要一个额外的生命周期参数,这看起来不太实用)。

我可能会结束切换到直接返回的“get_sign_content” Vec<u8>,但我真的更喜欢返回可编码的结构。

唯一缺少的是表达我的关联类型生命周期界限与其父级相同,类似的东西(无效)

impl TrustedVal for RSAPeer
{
    type SignedContent = TrustedPeerToSignEnc<'Self::lifetime>;
Run Code Online (Sandbox Code Playgroud)

或者

impl<'a> TrustedVal for RSAPeer where RSAPeer : 'a
{
    type SignedContent = TrustedPeerToSignEnc<'a>;
Run Code Online (Sandbox Code Playgroud)

我也考虑(这是有效的)

impl<'a> TrustedVal for &'a RSAPeer
{
    type SignedContent = TrustedPeerToSignEnc<'a>;
Run Code Online (Sandbox Code Playgroud)

但与其他一些代码相比,它变得非常尴尬。关于设计这个的正确方法有什么想法吗?

blu*_*uss 3

解决这个问题的一种方法是使生命周期参数成为特征的参数。这很有效,特别是当特征中只有一种方法时:

pub trait TrustedVal<'a> {
  type SignedContent : Encodable ;
  fn get_sign_content(&'a self) -> Self::SignedContent;
}

impl<'a> TrustedVal<'a> for RSAPeer
{
  type SignedContent = TrustedPeerToSignEnc<'a>;

  fn get_sign_content(&'a self) -> TrustedPeerToSignEnc<'a> {
    TrustedPeerToSignEnc {
      version : 0,
      name : &self.name,
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

要使用这样的特征作为界限,您可能必须使用这个漂亮的语法:

where T: for<'a> TrustedVal<'a>
Run Code Online (Sandbox Code Playgroud)