我正在尝试将具有不同参数的函数添加到向量中。
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)
但这给出了错误:
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]; }
有什么办法可以使这项工作?
发生错误是因为向量仅用于保存同类数据,即向量的每个元素都必须是相同的类型。为了解决这个问题,您可以例如使用枚举向量:
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)
输出
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), } } }
或者您可以使用专门用于存储异构数据的容器,也就是元组:
fn main() {
let v = (f1, f3, f2);
v.0();
v.1(2);
println!("{}", v.2("foo"));
}
Run Code Online (Sandbox Code Playgroud)
输出
Run Code Online (Sandbox Code Playgroud)Hello, World! 2 foo
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |