Rust TryFrom<&;[u8]>;以特质为界的特质
我正在尝试为从二进制数据(从磁盘读取)创建的一组类型实现公共特性。大多数trait方法都可以使用默认实现,只有转换等需要单独实现。我想使用Rust TryFrom<&;[u8]>;以特质为界的特质,rust,Rust,我正在尝试为从二进制数据(从磁盘读取)创建的一组类型实现公共特性。大多数trait方法都可以使用默认实现,只有转换等需要单独实现。我想使用TryFromtrait将二进制数据转换为我的类型,但我不知道如何(在trait的上下文中)表示和[u8]的生存期与从中创建的类型的值的生存期不相关。下面是这个问题的一个小例子 使用std::convert::TryFrom; 结构Foo; //Foo的值可以从&[u8]创建,但它不会借用任何东西。 针对Foo的impl TryFrom{ 类型错误=(); f
TryFrom
trait将二进制数据转换为我的类型,但我不知道如何(在trait的上下文中)表示和[u8]
的生存期与从中创建的类型的值的生存期不相关。下面是这个问题的一个小例子
使用std::convert::TryFrom;
结构Foo;
//Foo的值可以从&[u8]创建,但它不会借用任何东西。
针对Foo的impl TryFrom{
类型错误=();
fn try_from(v:&[u8])->结果{
Ok(Foo)
}
}
这里不能使用没有显式生存期名称的特征栏,/`&`
{
fn baz()->Self{
设vec=vec::new();
Self::try_from(&vec).unwrap()//错误:vec的寿命不够长(未借用任何内容)
}
}
另一种解决方案是将转换作为特征方法,但最好使用普通的std特征。有没有办法做到这一点?(或者我可以使用const泛型,但我不想依赖夜间编译器。)您想要的是“更高等级的特征边界”(HRTB,或者简单地说)。它们看起来是这样的:for,
您还可以直接将该需求指定为超级特征绑定,而不是where
子句:
trait Bar:用于{…}
是的,现在它只是意味着所有Bar
的实现者都必须实现TryFrom您想要的是“更高等级的特征界限”(HRTB,或者简单地说)。它们看起来是这样的:for,
您还可以直接将该需求指定为超级特征绑定,而不是where
子句:
trait Bar:用于{…}
是的,现在它只意味着Bar
的所有实现者都必须实现TryFromThank,这正是我想要的。然而,我不知道你们所说的直接指定超级特质绑定的优势是什么意思。我的印象是使用where子句在语义上是等价的(我认为where版本更易于阅读)。@awdrt-mhh,很有趣。我认为这会影响到其他人对这种特质的期望。但是我试过了,我找不到where
和super-trait-bound之间的区别。所以我把这句话从我的回答中删除了。也许我只是记错了:在第一个例子中traitBar@Kitsu谢谢,修正了错误。谢谢,这正是我想要的。然而,我不知道你们所说的直接指定超级特质绑定的优势是什么意思。我的印象是使用where子句在语义上是等价的(我认为where版本更易于阅读)。@awdrt-mhh,很有趣。我认为这会影响到其他人对这种特质的期望。但是我试过了,我找不到where
和super-trait-bound之间的区别。所以我把这句话从我的回答中删除了。也许我只是记错了:在第一个例子中traitBar@Kitsu谢谢,修正了错误。