我有一些具有相同通用类型签名的函数:
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。
答案 0 :(得分:2)
您不能拥有泛型类型的函数指针。您需要选择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];
}
这里的直觉是函数指针必须指向。在为函数提供特定类型之前,不会生成任何实际代码 - 编译器无法创建无限数量的函数,以防其中一个函数稍后被选中。
另见: