我有一个关于特定特征的定义的问题。基本上我想定义一个特征,它提供一个函数来获取可以识别它的结构的 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)
我可以做什么来克服这个问题?
您的代码让调用者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 的答案并在特征上使用类型参数。