【问题标题】:Trait as generic parameter to struct object intialization特征作为结构对象初始化的通用参数
【发布时间】:2020-10-19 09:26:24
【问题描述】:
我有这个结构:
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();
}
Full Code
此代码会引发无法将特征制成对象的编译错误。我是 Rust 的新手,很多在线解决方案都没有解决这个问题。请告诉我如何绕过 bar 对象的初始化。
【问题讨论】:
标签:
rust
blockchain
traits
generic-programming
substrate
【解决方案1】:
您的困惑可能源于sp_runtime crate 有两个名为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();
}
但是,鉴于这是 crate 中 trait 的唯一实现,您可以完全避免提及该 trait 并使用具体的结构类型(除非您计划自己实现它或依赖其他箱子的实现):
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();
}