请查看代码:
struct Human {
name: String,
profession: Profession,
}
enum Profession {
Doctor,
Teacher
}
struct Family {
family_doctor: // How to express type that will mean Human (because name matters) of profession Doctor?
}
是否可以通过以某种方式使Human
通用并将变量Doctor
作为profession
字段的类型参数来实现?如果没有,那么您会建议这种关系的最接近的解决方法是什么?
请注意,该问题可能与较旧的问题重复。但是首先,Rust不断发展,其次,我正在寻求一种解决方法。
答案 0 :(得分:1)
可能最简单的方法是使Profession
成为特征而不是enum
,并使每个Profession
成为单位结构:
struct Human<P: ?Sized + Profession> {
name: String,
profession: P,
}
struct Doctor;
struct Teacher;
trait Profession {}
impl Profession for Doctor {}
impl Profession for Teacher {}
struct Family {
family_doctor: Human<Doctor>,
}
大多数接受人类的函数都可以使用泛型或impl Profession
来表达:
fn into_name<P: Profession>(any_human: Human<P>) -> String {
any_human.name
}
编写接受不同类型的Human函数的另一种方法是使用动态调度。如果以这种方式进行,对Human
的任何访问都必须通过指针完成,例如Box<Human<dyn Profession>>
或&Human<dyn Profession>
(在{{1的定义中请注意this works because of P: ?Sized
}}):
Human
另一种可能性是为fn into_name_dyn(any_human: Box<Human<dyn Profession>>) -> String {
any_human.name
}
实现Profession
并将其用作类型参数。这会将指针放在Box<dyn Profession>
内,因此只有Human
在其后面:
Profession
如果您仍然想要impl<P: ?Sized + Profession> Profession for Box<P> {}
fn into_name_box(any_human: Human<Box<dyn Profession>>) -> String {
any_human.name
}
,这是一个建议:将结构放入同名变量中。这样,当您将行为添加到enum
特性中时,可以通过推迟内部类型的实现来为Profession
实现Profession
。 SomeProfession
板条箱可以简化此过程。
enum_derive