【问题标题】:Unconstrained lifetime on nightly, design advice needed每晚无限制的使用寿命,需要设计建议
【发布时间】:2015-04-20 18:54:58
【问题描述】:

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

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

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

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

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>;

但是使用其他一些代码会变得非常尴尬。有什么正确设计方法的想法吗?

【问题讨论】:

  • 据我所知,实现原始形式的唯一方法是使用(有限形式的)更高种类的类型,允许使用 trait TrustedVal { type SignedContent&lt;'a&gt;: Encodable; fn get_sign_content(&amp;'a self) -&gt; Self::SignedContent&lt;'a&gt;; }impl TrustedVal for RSAPeer { type SignedContent&lt;'a&gt; = TrustedPeerToSignEnc&lt;'a&gt;; ... 之类的东西。不幸的是,此功能现在/尚不存在。
  • 原来是这样的。

标签: rust lifetime


【解决方案1】:

修复它的一种方法是使生命周期参数成为特征上的参数。这很有效,尤其是当您在 trait 中只有一种方法时:

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>

【讨论】:

  • 不幸的是代码是错误的,至少,编译器处理不当,并允许发生内存不安全。我怀疑它应该是非法的:#24622.
  • 这很可悲,但我无法指出代码中有什么问题。它应该表明 self 和返回值之间的正确借用关系。
  • 谢谢,这是我的第一次尝试,但它对我的其他特征有很大影响(至少没有漂亮的语法)。例如,对于使用 TrustedVal 和附加参数的键值存储特征,我需要将生命周期添加到存储特征(等等其他特征):is.gd/EPat2Q。但是通过“漂亮的语法”,我可以删除我的 trait 中的附加参数:is.gd/jGO9Zy。我想知道是否有一些关于这种语法的文档或类似的文档允许我避免将生命周期传播到特征,例如 is.gd/AIoLLW中的 TrustedPeer@
  • @user139873,对,答案中的代码本身并不具有内存不安全性,但是使用任何使用该特征的通用代码很容易触发。我不清楚这是“应该”的情况,因为关联类型的生命周期和特征的生命周期之间没有直接联系,如果我们想隐式强加'a: Self::SignedContent(即SignedContent 最多 'a 有效。
猜你喜欢
  • 2011-11-13
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多