Enums 如何在结构中具有特征字段?

Enums 如何在结构中具有特征字段?,enums,rust,traits,Enums,Rust,Traits,我有一些代码,我想变成一个板条箱。但它包含一个结构,其中包含一个字段,我希望板条箱的用户提供该字段。但我需要该字段的功能,所以我想将其指定为特性 pub trait RoleTrait { fn owner<T: RoleTrait>() -> T; fn order<T: RoleTrait>(&self) -> usize; } pub struct RequestInfo<Role: RoleTrait + Partial

我有一些代码,我想变成一个板条箱。但它包含一个结构,其中包含一个字段,我希望板条箱的用户提供该字段。但我需要该字段的功能,所以我想将其指定为特性

pub trait RoleTrait {
    fn owner<T: RoleTrait>() -> T;
    fn order<T: RoleTrait>(&self) -> usize;
}

pub struct RequestInfo<Role: RoleTrait + PartialEq> {
    role: Option<Role>,
    name: String,
}

impl<Role: RoleTrait> RequestInfo<Role>
where
    Role: std::cmp::PartialEq,
{
    fn name(&self) -> String {
        self.name.to_string()
    }

    fn role(&self) -> &Option<Role> {
        &self.role
    }

    fn is_owner(&self) -> bool {
        if let Some(role) = self.role {
            role == Role::owner()
        } else {
            false
        }
    }
    fn order(&self) -> usize {
        if let Some(role) = self.role {
            role.order() + 1
        } else {
            0
        }
    }

    fn from(name: String) -> RequestInfo<Role> {
        RequestInfo::<Role> {
            role: None,
            name: name,
        }
    }

    fn with_role(name: String, role: Role) -> RequestInfo<Role> {
        RequestInfo::<Role> {
            role: Some(role),
            name: name,
        }
    }
}
我有3个错误

错误[E0282]:需要类型注释
-->src/main.rs:28:18
|
28 |角色顺序()+1
|^^^无法推断'T'的类型`
错误[E0308]:类型不匹配
-->src/main.rs:55:9
|
54 | fn所有者()->T{
|-由于返回类型,应为'T'
55 | CourseRole::教授
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^所需的类型参数,找到枚举`CourseRole`
|
=注意:应为'T'类型`
已找到类型“CourseRole”`
错误[E0308]:类型不匹配
-->src/main.rs:72:9
|
71 | fn所有者()->T{
|-由于返回类型,应为'T'
72 |博客角色::所有者
|^^^^^^^^^^^^^^^^^^^^^应为类型参数,找到枚举`BlogRole`
|
=注意:应为'T'类型`
找到类型`BlogRole`
(另一个枚举重复第二个错误)

坦白地说,我很惊讶(也很高兴!)我的一些代码是有效的(比如trait中对
owner
的引用).当我开始写这个问题时,我犯了很多错误,但我无法找出剩下的错误,因为
t
看起来很清楚,
rustc
似乎已经解决了更难的问题。在最后两个错误中,它几乎没有意识到枚举的trait实现,因为它不在他正在定义该实现(但在其他地方它显然明白这一点)。

这种特性让人觉得有点“不对劲”:

pub trait RoleTrait {
    fn owner<T: RoleTrait>() -> T;
    fn order<T: RoleTrait>(&self) -> usize;
}


这个小小的更改导致所有类型错误都得到解决,只留下几个小的借用错误(),可以很容易地解决()。

您可以通过添加类型信息来解决第一个问题,如
role.order:()
。第二个/第三个问题可能源于您决定使用类型参数而不是。非常好,谢谢。由于T和Self可能不同,现在很清楚为什么它无法推断正确的类型。
pub trait RoleTrait {
    fn owner<T: RoleTrait>() -> T;
    fn order<T: RoleTrait>(&self) -> usize;
}
pub trait RoleTrait {
    fn owner() -> Self;
    fn order(&self) -> usize;
}