当前位置: 首页 > 知识库问答 >
问题:

rust - 请教封装返回泛型数据的问题?

钱青青
2023-05-08

我尝试对redis进行一个简单的封装,遇到返回泛型数据的问题。代码如果下,我希望获取数据时能用泛型指定数据类型:

pub trait Cache {
    async fn get<T>(&self, key: &str) -> Result<T, Error>;
}

实现方法如下:

impl Cache for Redis {
    async fn get<T>(&self, key: &str)-> Result<T, Error> {
        let r = self.conn.get(key).await?;
        Ok(r)
    }
}

提示如下错误:

error[E0277]: the trait bound `T: FromRedisValue` is not satisfied
    --> src/redis.rs:55:21
     |
55   |         let r = self.conn.get(key).await?;
     |                           ^^^ the trait `FromRedisValue` is not implemented for `T`
     |

请问如果不改 T 为 T: FromRedisValue的话,有什么其他解决办法吗?谢谢

共有1个答案

姜业
2023-05-08
use redis::{AsyncCommands, RedisError};

pub trait Cache {
    type Output;

    async fn get<T>(&self, key: &str) -> Result<Self::Output, RedisError>;
}

impl Cache for redis::Client {
    type Output = String;

    async fn get<T>(&self, key: &str) -> Result<Self::Output, RedisError> {
        let mut conn = self.get_async_connection().await?;
        let r: Self::Output = conn.get(key).await?;
        Ok(r)
    }
}
 类似资料:
  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • 我是scala的新手,如果您能帮助我解决以下问题,我将不胜感激。 我正在使用akka-http发送http请求我想声明一个泛型发送请求方法,它将使用Unmarshall的http响应主体转换为泛型类型。 我应该如何将Unmarshal响应强制转换为T??? 发送请求实现:

  • 演示代码:https://tsplay.dev/N5jo0m 从cut以上,可以看到都是正确的,问题在函数sellect 我需要根据第一个参数name: T去判断第二个参数data的类型 提供的name是fixed就限制data是FixedInstance,否则就限制为FollowInstance 问题1:我在sellect参数传参的时候故意 as FollowInstance,在TS中并没有报错

  • 我正在尝试创建一个通用函数,它接受一个,并返回一个对象,该对象包含公共基类型的属性以及特定类型的默认值。出于某种原因,如果没有编译器的抱怨,我无法让它工作。我不确定问题出在哪里,但是 我怀疑这可能是将类型定义为条件类型的方式。我尝试过以各种方式重新定义我的类型,但没有成功,所以我怀疑我要么错过了一些明显的东西,要么没有类型断言是不可能的。 以下是我的类型: 以下是我的通用函数: 产生以下错误: 类

  • 对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi

  • 我想让一个函数返回一个保证实现两个接口的对象。编译时不一定知道确切的对象。我的代码看起来像: 在尝试编译时,我遇到以下错误: 你好世界java:13:错误:不兼容的类型:C无法转换为T 返回新的C() ^ 其中T是一个类型变量: T扩展了方法f(布尔值) HelloWorld中声明的a,B。java:14:错误:不兼容的类型:D无法转换为T 返回新的D() ^ 其中T是一个类型变量: T扩展了方法