我正在尝试为可在字节片之间进行转换的对象定义特征。我本质上想说
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>; }
?
可以使用所有生命周期而不是某个特定生命周期保留的生命周期参数限制的特征,可以使用所谓的高级特征限制或HRTB指定。在您的情况下,可能看起来像
trait Foo: AsRef<[u8]> + for<'a> TryFrom<&'a [u8]> {}
Foo
的任何实现都必须满足TryFrom<&'a u8>
的所有选择,因此'a
本身不需要生存期。