我有一个关于特定特征定义的问题.基本上,我想定义一个特征,该特征提供一个函数来获取可以标识它的 struct 的id(或键). 然而,我被困住了,不知道如何定义特征(或具体实现).

例如,我在这里有这个 struct Data:

#[derive(Debug)]
struct Data{
    id: String,
    value: i32
}

现在让我们假设我想要创建一个只包含单个函数的特征.该函数应该提供某种类型的密钥(因此是Hasable等):

trait Entity {
    fn get_id<K: Eq + PartialEq + Hash>(&self) -> K;
}

但当我想要实现特征时,我被卡住了.例如,我收到以下代码片段的错误消息mismatched types:

impl Entity for Data {
    fn get_id<String>(&self) -> String {
        self.id.clone()
    }
}

我能做些什么来克服这个问题?

推荐答案

您编写它的方式意味着调用者决定应该是什么类型,而这似乎不是您想要的类型.您应该将泛型类型移到特征定义中.

trait Entity<K: Eq + PartialEq + Hash> {
    fn get_id(&self) -> K;
}
impl Entity<String> for Data {
    fn get_id(&self) -> String {
        self.id.clone()
    }
}

Rust相关问答推荐

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

如何装箱生命周期相关联的两个对象?

在泛型 struct 的字段声明中访问关联的Conant

将PathBuf转换为字符串

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

为什么这个变量不需要是可变的?

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

确保参数是编译时定义的字符串文字

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

为什么我的trait 对象类型不匹配?

Rust并发读写引起的死锁问题

Rust 异步循环函数阻塞了其他future 任务的执行

Rust 生命周期:这两种类型声明为不同的生命周期

一个函数调用会产生双重borrow 错误,而另一个则不会

预期的整数,找到 `&{integer}`

是否有适当的方法在参考 1D 中转换 2D 数组

如何将切片推入数组?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?