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

标签 generics rust

所以建立了一个小项目来学习 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/

相关文章:

swift - 是否有必要将类型参数传递给泛型类中的静态函数?

c# - 如何最好地构建此 API 以存储通用委托(delegate)以供以后执行

haskell - SOP表示转换后如何从类型中获取数据类型信息?

string - 用同一向量 Rust 中的另一个字符串扩展一个字符串

rust - 当特征函数依赖于为 Self 实现的通用标记特征时,实现通用包装器

multithreading - 简单服务器 - 如果尝试流式传输文件,线程将保持打开状态

java - 实例化使用 <Foo extends Bar<Foo>> 的通用对象

java - 有没有办法让 A<Number> 的子类 B<Double> 被强制转换为 A<Number>?

generics - 如何调用许多不同类型的函数?

rust - 有没有办法在 Rust 中用 "0x"右对齐十六进制数?