【发布时间】:2020-07-13 07:24:08
【问题描述】:
我正在尝试为从二进制数据(从磁盘读取)创建的一堆类型实现共同特征。大多数特征方法可以使用默认实现,并且只需要单独实现转换等。我想使用TryFrom<&[u8]> trait 将二进制数据转换为我的类型,但我不知道如何表达(在 trait 的上下文中)&[u8] 的生命周期以及从中创建的类型的值的生命周期是不相关的。这是问题的最小示例。
use std::convert::TryFrom;
struct Foo;
// Value of Foo can be created from &[u8] but it doesn't borrow anything.
impl TryFrom<&[u8]> for Foo {
type Error = ();
fn try_from(v: &[u8]) -> Result<Self, ()> {
Ok(Foo)
}
}
trait Bar<'a>
where
Self: TryFrom<&'a [u8], Error = ()>, // `&` without an explicit lifetime name cannot be used here
{
fn baz() -> Self {
let vec = Vec::new();
Self::try_from(&vec).unwrap() // ERROR: vec does not live long enough (nothing is borrowed)
}
}
另一种解决方案是将转换作为特征方法,但使用常见的 std 特征会更好。有没有办法做到这一点? (或者我可以使用 const 泛型,但我不想依赖夜间编译器。)
【问题讨论】:
标签: rust