tutorial programacion imagenes erlang

programacion - erlang tutorial



¿Cómo llamar un módulo dinámicamente en Erlang? (2)

Supongamos que tengo dos módulos a.erl y b.erl . Ambos módulos contienen las mismas funciones (en Java, diría que "ambas clases implementan la misma interfaz"). En el módulo "c.erl" quiero tener una función que devuelva el módulo "a" o "b" (depende del parámetro)

Esto es lo que quiero tener en el módulo c.erl

-module(c) get_handler(Id) -> % if Id == "a" return a % if Id == "b" return b test() -> get_handler("a"):some_function1("here were go for a"), get_handler("a"):some_function2("aaaa"), get_handler("b"):some_function1("here we go for b")

¿Cómo puedo hacer que esto funcione? Soy relativamente nuevo en Erlang y no sé cómo hacerlo. En Java sería muy obvio, porque solo devuelve una nueva instancia de la clase.


Si tiene un átomo en una variable, puede usarlo como un nombre de módulo.

Entonces, podrías definir c:get_handler/1 así:

get_handler("a") -> a; get_handler("b") -> b.

Tu c:test/0 ve bien, excepto que necesitas corchetes adicionales, como este:

test() -> (get_handler("a")):some_function1("here were go for a"), (get_handler("a")):some_function2("aaaa"), (get_handler("b")):some_function1("here we go for b").

Luego, en los módulos a y b simplemente define un some_function1/1 y some_function/2 , por ejemplo:

some_function1(Str) -> io:format("module ~s function some_function1 string ~s~n", [?MODULE, Str]). some_function2(Str) -> io:format("module ~s function some_function2 string ~s~n", [?MODULE, Str]).

Editar: También deberías definir un comportamiento si vas a hacer este tipo de cosas por cierto, lo que significaría que declararías en los módulos a y b algo como esto:

-behaviour(some_behaviour).

Luego crea el módulo algo de some_behaviour algo como esto:

-module(some_behaviour). -callback some_function1 (String :: string()) -> ok . -callback some_function2 (String :: string()) -> ok .

Esto significa que cualquier módulo como a y b que declare que admite el comportamiento some_behaviour comportamiento debe definir esas funciones, y el compilador expresará si no lo hacen. Los tipos de los parámetros y el valor de retorno también se definen aquí para el análisis estático, etc.


Simplemente get_handler/1 que get_handler/1 devuelva el nombre del módulo como un átomo, y luego utilícelo para llamar a la función deseada:

(get_handler("a")):some_function2("aaaa"), (get_handler("b")):some_function1("here we go for b").

Tenga en cuenta que necesita paréntesis alrededor de la llamada a get_handler/1 en este caso.

Una versión simple de get_handler/1 para los módulos a y b podría ser:

get_handler("a") -> a; get_handler("b") -> b.