调用仅在运行时

时间:2015-05-30 00:04:54

标签: rust

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

1 个答案:

答案 0 :(得分: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);
    }    
}

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