微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决特性作为通用参数构造对象初始化

我有这个结构:

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>的定义中,可以用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();
}

但是,鉴于这是包装箱中特质的 only 实现,您可以完全避免提及特质并使用具体的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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。