【问题标题】: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&lt;T&gt; 的定义中,您可以用sp_runtime::traits::Block 约束T,但是当您构造Bar&lt;T&gt; 的实例时,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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多