有一些结构:
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来自库,因此我无法更改它们。
答案 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;,因为您扩展类型并且具有它没有用于实现的特征。