将其作为结构对象初始化的泛型参数



我有这个结构:

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的新手,很多在线解决方案都没有解决这个问题。请让我知道如何绕过初始化酒吧对象。

您的困惑可能源于sp_runtime板条箱有两个名为Block的项目。一个是特性sp_runtime::traits::Block,另一个是实现该特性的结构sp_runtime::generic::Block

特征可以用作类型参数的约束,但不能用作类型参数。

因此,在Bar<T>的定义中,可以用sp_runtime::traits::Block约束T,但当构造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();
}

然而,鉴于这是板条箱中特性的唯一实现,您可以避免完全提及特性,并使用具体的结构类型(除非您计划自己实现它或依赖于其他板条箱的实现(:

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();
}

最新更新