作为函数参数的不同结构的实例

时间:2014-11-05 13:07:41

标签: rust

有一些结构:

struct St1 {
  ..
}

impl St1 {
  pub fn new() -> St1 {
    //.......
  }
}

struct St2 {
  ..
}

impl St2 {
  pub fn new() -> St2 {
    //.......
  }
}

//and so on

在继承方面彼此没有关系,他们没有实现任何通用接口。我想创建一个接受任何这些结构的实例的函数:

fn my_func(???) { .... }

我该怎么做?我正在考虑创建一个枚举:

enum MyEnum {
  St1::new(), //error!
  St2::new()  //error!
}

// and then
fn my_func(en: MyEnum) { .... }

但是你可以看到它不起作用。你的想法?

请注意,结构S1,S2,S3来自库,因此我无法更改它们。

1 个答案:

答案 0 :(得分:3)

要创建枚举,您最好:

enum MyEnum {
   MySt1(St1),
   MySt2(St2)
}

也就是说,它有两个变体,每个变体都携带相应类型的数据。

如果您不关心您拥有哪种变体,另一种方法是定义您自己的特征并为两者实施:

trait Stuff { }
impl Stuff for St1 { }
impl Stuff for St2 { }

fn my_func<T: Stuff>(en: T) { ... }

这样做的好处是不必重复处理和添加枚举。这被称为&#34;扩展实现&#34;,因为您扩展类型并且具有它没有用于实现的特征。