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

cre*_*007 3 vector rust

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

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];
}
Run Code Online (Sandbox Code Playgroud)

但这给出了错误:

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];
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以使这项工作?

ruo*_*ola 6

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

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),
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

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),
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

输出

Hello, World!
2
foo
Run Code Online (Sandbox Code Playgroud)