如何定义一个特征方法来获取可以是其实现者设置的类型的值?

use*_*988 2 traits rust

我有一个关于特定特征的定义的问题。基本上我想定义一个特征,它提供一个函数来获取可以识别它的结构的 id (或键)。但是,我陷入困境,不知道如何定义该特征(或具体实现)。

例如我Data这里有这个结构:

#[derive(Debug)]
struct Data{
    id: String,
    value: i32
}
Run Code Online (Sandbox Code Playgroud)

现在假设我想创建一个仅包含单个函数的特征。这个函数应该提供某种类型的密钥(因此是可哈希的,等等):

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

但当我想实现这个特质时,我陷入了困境。例如,我收到以下代码片段的错误消息:类型不匹配:

impl Entity for Data {
    fn get_id<String>(&self) -> String {
        self.id.clone()
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以做什么来克服这个问题?

caf*_*e25 6

您的代码让调用get_id决定返回的 id 应该是什么类型。但这不是您想要的。现在,根据每个结构是否可以有不同的 id 还是只有一个 id,实现可以通过两种方式确定类型。如果每个结构只应Entity使用单一类型实现一次,则解决方案是关联类型:

trait Entity {
    type Id: Eq + PartialEq + Hash;
    fn get_id(&self) -> Self::Id;
}

impl Entity for Data {
    type Id = String;
    fn get_id(&self) -> String {
        self.id.clone()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想为同一结构启用多个不同的 id,您可以使用Tobi 的答案并在特征上使用类型参数。