调用仅在运行时已知的函数

Chr*_*oot 6 rust

我想通过一个输入验证服务器在Rust应用程序上做我的第一次尝试,该服务器可以验证来自AJAX请求的值.这意味着我需要一种方法来使用JSON配置文件来指定基于输入值的名称使用哪些验证函数,以及可能在HTTP请求中在运行时进入的表单名称.如何在Rust中执行类似于PHP的call_user_function_array的操作?

She*_*ter 10

您可以将函数的引用添加到HashMap:

use std::collections::HashMap;

// Add appropriate logic
fn validate_str(_: &str) -> bool { true }
fn validate_bool(_: &str) -> bool { true }

fn main() {
    let mut methods: HashMap<_, fn(&str) -> bool> = HashMap::new();

    methods.insert("string", validate_str);
    methods.insert("boolean", validate_bool);

    let input = [("string", "alpha"), ("boolean", "beta")];

    for item in &input {
        let valid = match methods.get(item.0) {
            Some(f) => f(item.1),
            None => false,
        };

        println!("'{}' is a valid {}? {}", item.1, item.0, valid);
    }    
}
Run Code Online (Sandbox Code Playgroud)

这里唯一棘手的部分是线let mut methods: HashMap<_, fn(&str) -> bool> = HashMap::new().您需要定义该映射将具有作为函数指针的值.每个函数都有自己独特的匿名类型,而函数指针则是一个抽象.

  • `_`告诉编译器推断类型(在这种情况下,`&str`),而不是让你手动编写它.有关更多示例,请参阅:http://is.gd/qiJUtJ (2认同)