gpt4 book ai didi

vector - 用任何类型的元组定义向量

转载 作者:行者123 更新时间:2023-11-29 08:16:37 25 4
gpt4 key购买 nike

我正在尝试定义一个自定义结构,其字段可以是 std::vec::Vecany 类型的元素:

use std::vec::Vec;

#[derive(Debug, PartialEq)]
pub struct BertDictionary {
data: Vec<(Any, Any)> // not work also with Vec<(_, _)>
}

编译时,这会生成一个 E0308 error这意味着编译器无法推断具体类型。是否可以定义这样的结构?

例如,当每个元素可能表示为 (name, "user")、(id, 1) 等时,我将使用此向量。

最佳答案

Any 是一个 trait,不是一个具体的类型,所以你需要在结构中添加一个泛型类型参数。

struct BertDirectory<T: Any> {
data: Vec<T>
}

您可能还想确保 T 也是实现 DebugPartialEq 的对象。这不是编译所必需的,但如果您想确保 BertDirectory 始终实现这些特征,则需要这样做。否则,它只会在 T 执行此操作时执行 Debug

struct BertDirectory<T: Any + Debug + PartialEq> {
data: Vec<T>
}

即使考虑到这两种情况,我也不知道这是否会给您真正想要的,因为 data 仍将被限制为单一类型T 只能代表每个结构实例的一个类型。

如果您需要数据 来存储不同类型的值,您可能想要考虑使用trait objects。相反,这是 Rust 使用 vTables 的方式:

pub trait MyTrait: Debug {
// you can still use Any by doing MyTrait: Any + Debug
// Note that you won't be able to derive PartialEq for your trait
// because PartialEq can't be made into a TraitObject

// can also define whatever methods you would want on your data, which
// might be preferable to using Any, if possible
}

pub struct BertDirectory<T: MyTrait>{
data: Vec<(Box<MyTrait>, Box<MyTrait>)>
}

这样,编译时就不需要知道 T 的具体类型。 data 中的每个元素都可以是不同的具体类型,并且会自动调用正确的方法。但是,您将无法导出 PartialEq,因此您只能自己实现它。

关于vector - 用任何类型的元组定义向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716349/

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