String { Str-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:25:47 25 4
gpt4 key购买 nike

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

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),
}
}
}

Output

Hello, World!
2
foo

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

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

Output

Hello, World!
2
foo

关于vector - 如何将具有不同参数和返回类型的函数添加到向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60540328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com