Jestem całkiem nowym użytkownikiem Elixir i funkcjonalnymi językami programowania w ogóle.Eliksir - Metoda wywołania w module według nazwy String
W Elixir, chcę wywołać jedną konkretną funkcję w modułach, biorąc pod uwagę nazwę modułu jako ciąg.
Mam następujący (bardzo źle) działający kod, który dość dużo robi to, co chcę:
module_name = elem(elem(Code.eval_file("module.ex", __DIR__), 0), 1)
apply(module_name, :helloWorld, [])
to (przynajmniej tak to rozumiem) kompiluje (już skompilowany moduł) module.ex
w bieżącym katalogu. Wyodrębniam nazwę modułów (nie jako String, nie wiem, jaki typ danych faktycznie jest) z dwóch krotek i uruchamiam na nich metodę helloWorld
.
Istnieją dwa problemy z tym kodem:
wypisuje ostrzeżenie jak
redefining module Balance
. Z pewnością nie chcę, aby tak się działo w produkcji.AFAIK ten kod kompiluje
module.ex
. Ale ponieważ moduł module.ex jest już skompilowany i załadowany, nie chce, aby tak się stało.
Nie muszę wywoływać metod w tych modułach przez nazwę pliku, nazwa modułu też byłaby w porządku. Ale musi to być dynamiczne, np. wpisanie "Księgi" w wierszu poleceń powinno, po sprawdzeniu, czy moduł istnieje, wywołać funkcję Book.helloWorld
.
Dzięki.
Mała uwaga: należy użyć to_existing_atom miarę możliwości. Atomy nie zbierają śmieci! –
Dzięki! Nie wiedziałem, że atomy nie są zebrane śmieci. Zmodyfikuje moją odpowiedź. – lschuermann