gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:44:36 25 4
gpt4 key购买 nike

我有这个结构:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com