特征作为结构对象初始化的通用参数

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

Full Code

此代码抛出无法将特征制成对象的编译错误。我是 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();
}