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;
}