我有几个具有相同泛型类型签名的函数:
pub fn selection_sort<T: Ord + Debug>(v: &mut [T]) {}
pub fn insertion_sort<T: Ord + Debug>(v: &mut [T]) {}
我想将它们放入 Vec
或数组中,以便我可以遍历它们并对它们运行相同的测试,如下所示:
let mut sorters: Vec<fn<T: Ord + Debug>(v: &mut [T])> = Vec::new();
但是我得到这个编译器错误:
error: expected `(`, found `<`
--> src/main.rs:8:28
|
8 | let mut sorters: Vec<fn<T: Ord + Debug>(v: &mut [T])> = Vec::new();
| ----------- ^
| |
| while parsing the type for `mut sorters`
如何将这些函数放入向量中?是否有更好的方法来针对满足此签名的函数重用测试?
我正在使用 Rust 1.24.0。
最佳答案
您不能拥有泛型类型的函数指针。您需要为 T
选择一个特定类型:
use std::fmt::Debug;
pub fn selection_sort<T: Ord + Debug>(v: &mut [T]) {}
pub fn insertion_sort<T: Ord + Debug>(v: &mut [T]) {}
fn main() {
let sorters_u8: &[fn(&mut [u8])] = &[selection_sort, insertion_sort];
let sorters_bool: &[fn(&mut [bool])] = &[selection_sort, insertion_sort];
}
这里的直觉是函数指针必须指向某物。在为函数提供特定类型之前,不会生成任何实际代码 — 编译器无法创建无限数量的函数,以防万一稍后选择其中一个。
另见:
关于rust - 如何创建具有泛型类型参数的函数向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264428/