gpt4 book ai didi

Rust 编译错误 - 无法推断类型参数的类型

转载 作者:行者123 更新时间:2023-12-05 02:01:17 26 4
gpt4 key购买 nike

我正在尝试用 Rust 编写一个简单的缓存实现。

总体思路是从远程位置获取序列化对象,反序列化,并将反序列化后的对象保存在本地缓存中。我想在缓存中使用 DeserializeOwned 特性,因为缓存对象的生命周期比原始数据长。

我从以下代码开始:

use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;


#[derive(Deserialize, Serialize)]
struct Demo{
s: u32
}

pub struct Cache<T : DeserializeOwned> {
cache: HashMap<String , T>,
}

impl<T: DeserializeOwned> Cache<T> {
pub fn new<K :DeserializeOwned>() -> Cache<K> {
let cache = HashMap::new();

Cache {
cache,
}

}
}

fn main() {
let cache = Cache::new::<Demo>();
}

出现以下错误:

error[E0283]: type annotations needed
--> src/main.rs:96:17
|
84 | pub fn new<K :DeserializeOwned>() -> Cache<K> {
| ---------------- required by this bound in `Cache::<T>::new`
...
96 | let cache = Cache::new::<Demo>();
| ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
|
= note: cannot satisfy `_: DeserializeOwned`

但是如果我尝试为 Demo 对象实现 DeserializeOwned,编译器会提示实现冲突。

任何帮助将不胜感激:)

最佳答案

Cache::new 有两个独立的通用类型参数,您的示例的完全限定语法为 Cache::<Demo>::new::<Demo>() .这可能不是您想要的,因为 Cache 上的类型参数本身在 Cache::new 中完全未使用.相反,我会从函数中删除类型参数,而是使用 Cache 中的现有类型参数。 ,像这样:

use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;


#[derive(Deserialize, Serialize)]
struct Demo{
s: u32
}

pub struct Cache<T : DeserializeOwned> {
cache: HashMap<String , T>,
}

impl<T: DeserializeOwned> Cache<T> {
pub fn new() -> Cache<T> {
let cache = HashMap::new();

Cache {
cache,
}

}
}

fn main() {
let cache = Cache::<Demo>::new();
}

Playground link

关于Rust 编译错误 - 无法推断类型参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66693230/

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