生锈 – 每晚不受限制的生命周期,需要设计建议

我有点卡在一些代码上,
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>;

要么

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

我也考虑(这是有效的)

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

但是其他一些代码变得非常尴尬.有关正确设计方法的任何想法吗?

最佳答案 解决此问题的一种方法是将life参数作为特征的参数.这种方法很有效,特别是当您在特征中只有一个方法时:

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,
    }
  }
}

要使用这样的特性作为绑定,你可能必须使用这个漂亮的语法:

where T: for<'a> TrustedVal<'a>
点赞