Types 如何使包含枚举变量的结构覆盖枚举变量?

Types 如何使包含枚举变量的结构覆盖枚举变量?,types,rust,Types,Rust,请看一下代码: 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以某种方式成为

请看一下代码:

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
以某种方式成为泛型,并将variant
Doctor
作为
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>,
}
编写接受不同类型人员的函数的另一种方法是使用动态分派。如果这样做,则必须通过指针访问
,如
(请注意
的定义):

如果您仍然需要
枚举
,这里有一个建议:将结构放在相同的命名变量中。这样,当您向
Profession
特征添加行为时,您可以通过遵从内部类型的实现来为
SomeProfession
实现
Profession
enum\u派生
板条箱可以简化此过程

enum SomeProfession {
    Doctor(Doctor),
    Teacher(Teacher),
}

impl Profession for SomeProfession {}

fn into_name_enum(any_human: Human<SomeProfession>) -> String {
    any_human.name
}
enum SomeProfession{
医生(医生),,
老师(老师),,
}
为某个职业{}执行职业
fn到\u name\u enum(任意\u人:人)->字符串{
任何人的名字
}
另见

这个解决方案意味着人类不能改变职业。哇,这是一个惊人的答案!最后一种方法对我来说完全有意义,看起来也不错。也就是说,为了解决我原来的问题,即字段的复制,我更倾向于使用组合方法,即将复制的字段放入结构中。你的回答告诉我有哪些选择,让我来选择。
fn into_name_dyn(any_human: Box<Human<dyn Profession>>) -> String {
    any_human.name
}
impl<P: ?Sized + Profession> Profession for Box<P> {}

fn into_name_box(any_human: Human<Box<dyn Profession>>) -> String {
    any_human.name
}
enum SomeProfession {
    Doctor(Doctor),
    Teacher(Teacher),
}

impl Profession for SomeProfession {}

fn into_name_enum(any_human: Human<SomeProfession>) -> String {
    any_human.name
}