我正在尝试用 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,编译器会抱怨冲突的实现。
任何帮助,将不胜感激 :)
您有两个单独的泛型类型参数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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3236 次 |
| 最近记录: |