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

Eya*_*hem 3 rust

我正在尝试用 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>(); 
}
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

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`
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试实现DeserializeOwned对象Demo,编译器会抱怨冲突的实现。

任何帮助,将不胜感激 :)

ape*_*lla 5

您有两个单独的泛型类型参数Cache::new,并且您的示例的完全限定语法为Cache::<Demo>::new::<Demo>()。这可能不是您想要的,因为类型参数本身CacheCache::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(); 
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接