我有一个关于特定特征定义的问题。基本上,我想定义一个trait,它提供一个函数来获取可以识别它的结构体的id(或键)。然而,我被卡住了,不知道如何定义trait(或具体的实现)。
例如,我在这里有这个结构Data
:
#[derive(Debug)]
struct Data{
id: String,
value: i32
}
现在假设我想创建一个只包含一个函数的trait。这个函数应该提供某种键(因此是hashable等):
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()
}
}
我能做些什么来克服这个问题?
2条答案
按热度按时间mpgws1up1#
您的代码让
get_id
的 * 调用者 * 决定返回的id应该是哪种类型。但这不是你想要的。现在,根据每个结构体可以有不同的id还是只有一个id,实现可以通过两种方式确定类型。如果每个struct应该只实现Entity
一次,那么关联类型是解决方案:如果你想为同一个结构体启用多个不同的id,你可以使用Tobi's answer,并在trait上使用一个类型参数。
ctzwtxfj2#
你写它的方式意味着调用者决定类型应该是什么,这似乎不是你想要的。你应该将泛型类型移到trait定义中。