如何使用泛型类型参数创建函数向量?

时间:2018-03-13 19:29:50

标签: rust

我有一些具有相同通用类型签名的函数:

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。

1 个答案:

答案 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];
}

这里的直觉是函数指针必须指向。在为函数提供特定类型之前,不会生成任何实际代码 - 编译器无法创建无限数量的函数,以防其中一个函数稍后被选中。

另见: