我有这个结构:
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();
}