有一些结构:
struct St1 {
..
}
impl St1 {
pub fn new() -> St1 {
//.......
}
}
struct St2 {
..
}
impl St2 {
pub fn new() -> St2 {
//.......
}
}
//and so on
在继承方面彼此没有关系,它们不实现任何公共(public)接口(interface)。我想创建一个接受以下任何结构的实例的函数:
fn my_func(???) { .... }
我该怎么做?我正在考虑创建一个枚举:
enum MyEnum {
St1::new(), //error!
St2::new() //error!
}
// and then
fn my_func(en: MyEnum) { .... }
但是如您所见,它不起作用。你的想法?
请注意,结构 S1、S2、S3 来自库,因此我无法更改它们。
最佳答案
要创建枚举,您宁愿这样做:
enum MyEnum {
MySt1(St1),
MySt2(St2)
}
也就是说,它有两个变体,每个变体携带各自类型的数据。
如果您不关心您拥有的哪个变体,另一种方法是定义您自己的特征并为两者实现它:
trait Stuff { }
impl Stuff for St1 { }
impl Stuff for St2 { }
fn my_func<T: Stuff>(en: T) { ... }
这样做的好处是不必重复处理和添加枚举。这称为“扩展实现”,因为您正在扩展具有它未曾实现的特征的类型。
关于rust - 不同结构的实例作为函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26758010/