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

mnemlml8  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(137)

我有一个关于特定特征定义的问题。基本上,我想定义一个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()
    }
}

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

mpgws1up

mpgws1up1#

您的代码让get_id的 * 调用者 * 决定返回的id应该是哪种类型。但这不是你想要的。现在,根据每个结构体可以有不同的id还是只有一个id,实现可以通过两种方式确定类型。如果每个struct应该只实现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()
    }
}

如果你想为同一个结构体启用多个不同的id,你可以使用Tobi's answer,并在trait上使用一个类型参数。

ctzwtxfj

ctzwtxfj2#

你写它的方式意味着调用者决定类型应该是什么,这似乎不是你想要的。你应该将泛型类型移到trait定义中。

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

相关问题