如何解决特性作为通用参数构造对象初始化
我有这个结构:
use sp_runtime::traits::Block;
struct Bar<T: Block> {
e1: Vec<T>,}
impl<T: Block> Bar<T> {
pub fn new() -> Self {
Bar { e1: Vec::new() }
}
}
Block
来自sp_runtime
板条箱。
主要:
fn main() {
let var_1 = Bar::<Block>::new();
}
此代码引发无法将特征变成对象的编译错误。我是Rust的新手,很多在线解决方案都没有解决这个问题。请让我知道如何避开bar对象的初始化。
解决方法
您的困惑很可能是由于sp_runtime
板条箱有两个称为Block
的事实。一个是特征sp_runtime::traits::Block
,另一个是结构sp_runtime::generic::Block
,它实现了该特征。
特质可以用作类型参数上的约束,但不能用作类型参数。
因此,在Bar<T>
的定义中,可以用T
约束sp_runtime::traits::Block
,但是在构造Bar<T>
的实例时,T
需要改为结构。
use sp_runtime::traits::Block;
struct<T: Block> Bar {
e1: Vec<T>,}
impl<T: Block> Bar<T> {
pub fn new() -> Self {
Bar {
e1: Vec::new(),}
}
}
fn main() {
use sp_runtime::generic::Block;
let var_1 = Bar::<Block>::new();
}
但是,鉴于这是包装箱中特质的 only 实现,您可以完全避免提及特质并使用具体的struct类型(除非您计划自己实施或依赖关于其他板条箱的实现):
use sp_runtime::generic::Block;
struct Bar{
e1 : Vec<Block>,}
impl Bar {
pub fn new() -> Self{
Bar {
e1: Vec::new(),}
}
}
fn main() {
let var_1 = Bar::new();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。