Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust TryFrom<&;[u8]>;以特质为界的特质_Rust - Fatal编程技术网

Rust TryFrom<&;[u8]>;以特质为界的特质

Rust TryFrom<&;[u8]>;以特质为界的特质,rust,Rust,我正在尝试为从二进制数据(从磁盘读取)创建的一组类型实现公共特性。大多数trait方法都可以使用默认实现,只有转换等需要单独实现。我想使用TryFromtrait将二进制数据转换为我的类型,但我不知道如何(在trait的上下文中)表示和[u8]的生存期与从中创建的类型的值的生存期不相关。下面是这个问题的一个小例子 使用std::convert::TryFrom; 结构Foo; //Foo的值可以从&[u8]创建,但它不会借用任何东西。 针对Foo的impl TryFrom{ 类型错误=(); f

我正在尝试为从二进制数据(从磁盘读取)创建的一组类型实现公共特性。大多数trait方法都可以使用默认实现,只有转换等需要单独实现。我想使用
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谢谢,修正了错误。