如何添加具有不同参数的函数并将类型返回给向量?

爬行3007

我正在尝试将具有不同参数的函数添加到向量中。

fn f1() {
    println!("Hello, World!");
}
fn f2(s: &str) -> String {
    String::from(s)
}
fn f3(i: i32) {
    println!("{}", i);
}

fn main() {
    let v = vec![f1, f3, f2];
}

但这给出了错误:

error[E0308]: mismatched types
  --> src/main.rs:12:22
   |
12 |     let v = vec![f1, f3, f2];
   |                      ^^ incorrect number of function parameters
   |
   = note: expected type `fn() {f1}`
           found fn item `fn(i32) {f3}`

有什么办法可以使我工作?

发生错误是因为向量仅用于保存同类数据,即向量的每个元素都必须具有相同的类型。为了解决这个问题,您可以例如使用枚举向量:

enum E {
    F1(fn()),
    F2(fn(&str) -> String),
    F3(fn(i: i32)),
}

fn f1() {
    println!("Hello, World!");
}
fn f2(s: &str) -> String {
    String::from(s)
}
fn f3(i: i32) {
    println!("{}", i);
}

fn main() {
    let v = vec![E::F1(f1), E::F3(f3), E::F2(f2)];
    for func in v {
        match func {
            E::F1(f) => f(),
            E::F2(f) => println!("{}", f("foo")),
            E::F3(f) => f(2),
        } 
    }
}

输出量

Hello, World!
2
foo

或者,您可以使用专门用于存储异构数据的容器(也称为元组):

fn main() {
    let v = (f1, f3, f2);
    v.0();
    v.1(2);
    println!("{}", v.2("foo"));
}

输出量

Hello, World!
2
foo

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何声明一个泛型函数,该函数返回一个具有相同参数但其参数返回类型不同的函数(反应钩子)

具有不同参数子类型的Julia函数

具有不同参数类型的虚函数

具有不同参数的类型,例如函数重载

如何实现具有不同参数/返回类型的抽象方法

java:如何复制具有不同参数类型的值

如何实现对相同函数但具有不同参数的线程?

具有不同参数的抽象函数

如何在 C++ 中定义接受不同参数类型的函数向量?

C ++-17:将函数指针转换为具有不同参数指针类型的函数

如何将具有不同参数的函数用作函数参数

C ++模板可返回具有相同参数的不同类型

转换具有不同参数类型的二进制运算函数

Angular 5 Material Table用具有不同参数类型的函数替换filterPredicate

创建具有不同参数类型的C#函数的列表

从抽象类上的方法返回子类型,或者在具有不同参数类型的子项上强制使用两个构造函数

为什么将具有不同参数类型的函数存储到带有void *参数UB的函数指针中?

如何将函数传递给具有不同参数的函数并执行c#

如何为一组具有几乎相同功能但具有不同参数和返回类型的类创建接口?

Scala:具有不同参数类型的反射

Typescript 中具有不同参数类型的类似方法

TypeScript具有相同参数的多种返回类型

如何实现具有不同参数类型的一种方法?

R函数%in%-具有相同参数的不同结果

重构唯一函数具有不同参数的位置

C ++继承重载具有不同参数的函数

键入具有任意数量不同参数的函数

具有不同参数传递的 Javascript 函数

使用相同的指针指向具有不同参数的函数