2015-05-30 2 views
4

Я хочу сделать первую попытку в приложении Rust, выполнив сервер проверки ввода, который может проверять значения из запроса AJAX. Это означает, что мне нужен способ использования файла конфигурации JSON, чтобы указать, какие функции проверки используются на основе имени входных значений и, возможно, имени формы, которые входят во время выполнения в HTTP-запросе. Как я могу сделать что-то похожее на PHP call_user_function_array в Rust?Вызов функции, известной только во время выполнения

ответ

8

Вы можете добавить ссылки на функции к 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(). Вам нужно определить, что эта карта будет иметь значения функции указатели. Каждая функция имеет свой собственный уникальный, анонимный тип, а указатели функций - это абстракция поверх этого.

+0

Хорошо, поэтому ссылка на функцию будет храниться аналогично тому, как вы можете это сделать в Javascript. Одна часть синтаксиса, который я не имею полного понимания, - это то, что находится между угловыми скобками. Я получаю, что во время компиляции во время компиляции определенно, что значения, присвоенные хешу, действительно являются указателями на функции, но я не могу найти ничего похожего на этот синтаксис в примерах Rust, в частности на '<_,' часть. Что такое знак подчеркивания в этом синтаксисе? –

+2

'_' говорит компилятору вывести тип (в данном случае' & str') вместо того, чтобы записать его вручную. См. Дополнительные примеры: http://is.gd/qiJUtJ – justinas

+0

Благодарим вас за помощь. Заставляет меня волноваться о строительстве вещей в Русте. У меня есть немало идей. Будучи в первую очередь рубином, PHP и Javascript-кодером, для меня это несколько новый мир. –

Смежные вопросы