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

标签 rust

有一些结构:

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/

相关文章:

c++ - 将 C++ 与 Rust 接口(interface) - 返回 CString panic

rust - Rust 的 C++ Friend-like 构造

function - 如何在 Rust 中将函数作为参数传递

rust - 如何在#[no_std] 环境中使用 Tokio Reactor?

来自 main.rs 的 rust 模块解析

rust - 根据参数分配

rust - 将数据从函数参数(从线程)发送到 mpsc channel

rust - Box::into_raw() 和 Box::leak() 到底有什么区别?

linux - 如何使用 Rust 打开用户默认的编辑器并获取编辑后的内容?

rust - 用 Rust 处理管道数据标准输入