rust - 特性作为通用参数来构造对象初始化

标签 rust blockchain traits generic-programming substrate

我有这个结构:

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 crate 。
在主要方面:
fn main() {
    let var_1 = Bar::<Block>::new();
}
Full Code
此代码引发无法将特征转化为对象的编译错误。我是Rust的新手,很多在线解决方案都没有解决这个问题。请让我知道如何避开bar对象的初始化。

最佳答案

您的困惑很可能是由于sp_runtime crate 有两个项目称为Block。一个是特征sp_runtime::traits::Block,另一个是结构sp_runtime::generic::Block,它实现了该特征。
特性可以用作类型参数的约束,但不能用作类型参数。
因此,在Bar<T>的定义中,可以用T约束sp_runtime::traits::Block,但是在构造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();
}
但是,鉴于这是包装箱中trait的唯一实现,您可以完全避免提及该特性并使用具体的struct类型(除非您计划自己实现它或依赖于其他包装箱的实现):
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();
}

关于rust - 特性作为通用参数来构造对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64424558/

相关文章:

python - 为什么 Python set 交集比 Rust HashSet 交集快?

c++ - 区 block 链 Hyperledger 私钥漏洞

pointers - 指向特征的指针

reference - Rust 找不到特征实现

rust - 如何处理 mio 中的错误?

rust - 如何使用 glutin 进行窗口覆盖重定向?

rust - libwasm_bindgen-a2e136f9a24e6618.rlib 挂起,编译时不占用 CPU

java - 如果我篡改了 corda 中的 h2 数据库,会发生什么?

java - 锯齿状无效批处理或签名

php - 如何检查一个类是否使用 PHP 中的特征?