es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de obtener un puntero a una función a partir de un tipo &str en Rust, pero requiere algunos pasos adicionales.

    Primero, debes definir un conjunto de funciones que puedan ser llamadas por el nombre proporcionado por el usuario. Estas funciones deben tener una firma consistente (es decir, deben tomar los mismos tipos de argumentos y devolver el mismo tipo). Por ejemplo:

    fn add(a: i32, b: i32) -> i32 {
        a + b
    }
    
    fn subtract(a: i32, b: i32) -> i32 {
        a - b
    }
    
    fn multiply(a: i32, b: i32) -> i32 {
        a * b
    }
    

    A continuación, puedes crear un mapa de nombres de funciones a punteros de funciones:

    use std::collections::HashMap;
    
    let mut functions = HashMap::new();
    functions.insert("add", add as fn(i32, i32) -> i32);
    functions.insert("subtract", subtract as fn(i32, i32) -> i32);
    functions.insert("multiply", multiply as fn(i32, i32) -> i32);
    

    Ahora, cuando el usuario proporciona un nombre de función, puedes buscar el puntero de función correspondiente en el mapa:

    let function_name = "add";
    if let Some(function) = functions.get(function_name) {
        let result = function(2, 3);
        println!("{}", result); // imprime "5"
    }
    

    Ten en cuenta que este enfoque requiere que definas todas las funciones posibles de antemano y las almacenes en un mapa. Si necesitas admitir funciones arbitrarias proporcionadas por el usuario, es posible que debas utilizar las capacidades de generación de código en tiempo de ejecución de Rust (por ejemplo, con los paquetes quote y proc-macro2) para crear un puntero a función en tiempo de ejecución.

Comments are closed.