首页 > 解决方案 > 超特征边界中的生命周期参数

问题描述

我正在尝试为可转换为字节切片的对象定义一个特征。我本质上想说

trait Foo: AsRef<[u8]> + TryFrom<&[u8]> {}

不幸的是,除非我在引用上放置生命周期参数,否则它拒绝编译,如下所示:

trait Foo<'a>: AsRef<[u8]> + TryFrom<&'a [u8]> {}

这对我来说没有多大意义,因为生命周期'a与最终try_from()调用有关,不应该是对象类型的一部分。(try_from()复制相关字节的实现,因此其参数的生命周期实际上并不相关。)

不过,这似乎是一个比切片更普遍的问题;你如何为超特征边界指定这样的生命周期参数?(显然'_不起作用。)有没有更好/更惯用的方式来表达这一点,还是我不得不求助于某种手工定制的废话,比如

pub trait TryFromRef<T> { type Error; fn try_from(value: &T) -> Result<Self, Self::Error>; }

?

标签: rusttraitslifetime

解决方案


一个具有生命周期参数的特征绑定,该参数适用于所有生命周期,而不是某个特定的生命周期,可以使用所谓的更高等级的特征边界或 HRTB 来指定。在您的情况下,这可能看起来像

trait Foo: AsRef<[u8]> + for<'a> TryFrom<&'a [u8]> {}

任何实现都Foo必须满足TryFrom<&'a u8>的任何和所有选择,因此它本身'a不需要生命周期。Foo

也可以看看


推荐阅读