特征作为结构对象初始化的通用参数
Trait as generic parameter to struct object intialization
我有这个结构:
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>
的定义中,您可以使用 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 中特性的 唯一 实现,您可以完全避免提及特性并使用具体的结构类型(除非您计划自己实现或依赖于其他板条箱的实现):
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();
}
我有这个结构:
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>
的定义中,您可以使用 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 中特性的 唯一 实现,您可以完全避免提及特性并使用具体的结构类型(除非您计划自己实现或依赖于其他板条箱的实现):
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();
}