gpt4 book ai didi

generics - 如何在结构/特征、常规变量声明和函数中最好地实现泛型?

转载 作者:行者123 更新时间:2023-12-03 11:43:49 24 4
gpt4 key购买 nike

所以建立了一个小项目来学习 Rust 并且想知道用 hashmap 定义向量的最好方法是什么
数据的方式最终将被结构化如下:

  [
{
id: "USER_ID",
firstname: "First Name",
lastname: "Last Name",
email: "Email",
errors: [ { type: "...", message: "cannot update user" } ],
}
]
所以我想我会写出我的项目如下
src/parser.rs
pub struct Parser<T> {
pub parsed_log: Vec<HashMap<String, T>>,
}

// pub trait ReturnProperties {
// fn return_parsed_logs(&self) -> Vec<HashMap<String, T>>;
// }

impl<T: Clone> Parser<T> {
/// handle upsert will parse the upsert lines into a users vector
/// it will also match the errors with the user id

// will implement later
//pub fn handle_upsert(...) {}

pub fn return_parsed_logs(self) -> Vec<HashMap<String, T, RandomState>> {
self.parsed_log.to_vec()
}
}

src/main.rs

fn main() {
// why does this keep returning
// cannot find type `T` in this scope??
let log_parser: parser::Parser<T> = Parser {
parsed_log: vec![]
};
}
我做这一切都错了吗?我想试图强制 rust 表现得像一种 OOP 语言(我来自哪里),但它没有。任何指针?我在这里完全错了什么?

最佳答案

// why does this keep returning
// cannot find type `T` in this scope??
let log_parser: parser::Parser<T> = Parser {
parsed_log: vec![]
};

因为没有类型 T在这个范围内?当你声明一个类型时, T是一个占位符(它是这样声明的,例如 <T: Clone>impl block 中的类型名之前所做的),但是当您使用该类型时,您需要提供一个实际的东西,或者一个类型在范围内的某个地方声明(通常在函数上,以便调用者可以提供该类型)。
请注意,您经常可以要求 Rust 推断类型,例如有时你会看到
let foo: Vec<_> = bar.collect();
这让 rustc 知道你想要 collect() 到 Vec ,但让它推断项目类型(因为它是明确的)。
然而,这里没有什么可以限制 T , 没有任何信息 rustc 可以用来决定它可以或将会是什么。
虽然我认为你的整个想法都是错误的:在 Rust 中,一个通用的 T将被单个具体类型替换。但这不是初始结构显示的内容,其中 4 个项目映射到字符串,但第 5 个项目映射到子结构数组。这不适合 T , 键具有完全不同的值。你为什么还要使用 HashMap和泛型,为什么不是结构或枚举?

关于generics - 如何在结构/特征、常规变量声明和函数中最好地实现泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66469454/

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