超特性边界中的生命周期参数

Lifetime parameters in supertrait bounds

我正在尝试为可转换为字节片和从字节片转换的对象定义特征。我基本上想说

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

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

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

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

不过,这似乎是一个比切片更普遍的问题;你如何为超特征边界指定这样的生命周期参数? (显然 '_ 不起作用。)是否有 better/more 惯用的方式来表达这一点,或者我是否必须诉诸某种手工制作的自定义废话,如

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

?

可以使用所谓的higher-ranked trait bound来指定具有适用于所有生命周期而不是某些特定生命周期的生命周期参数的特征绑定,或者HRTB。在你的情况下,这可能看起来像

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

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

另见