rust - 如何创建具有泛型类型参数的函数向量?

标签 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。

最佳答案

您不能拥有泛型类型的函数指针。您需要为 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/

相关文章:

generics - 无法将特征边界添加到结构成员

memory-management - 如何在 Rust 语言中以单个字节写入/读取 8 个 true/false

error-handling - Rust Arc/Mutex Try 宏借用的内容

rust - 为什么 Rust 借用检查器拒绝这个函数?

error-handling - 问号运算符如何转换错误类型? [复制]

rust - 如何编写一个宏来显示文件和行号以及可变数量的参数?

rust - 我怎样才能同时迭代 Rust HashMap 并修改它的一些值?

rust - 如何隐藏子模块中的方法但仍可从父模块中使用它?

rust - 为什么从 Actix Web 处理程序中的 Rusoto S3 流读取会导致死锁?

reference - 为什么我需要为返回引用的函数添加生命周期?