如何制作包含枚举泛型的枚举的结构?

时间:2019-12-20 13:52:29

标签: 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通用并将变量Doctor作为profession字段的类型参数来实现?如果没有,那么您会建议这种关系的最接近的解决方法是什么?

请注意,该问题可能与较旧的问题重复。但是首先,Rust不断发展,其次,我正在寻求一种解决方法。

1 个答案:

答案 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实现ProfessionSomeProfession板条箱可以简化此过程。

enum_derive

另请参见