Sono abbastanza nuovo per Elixir e per i linguaggi di programmazione funzionale in generale.Elixir - Metodo di chiamata sul modulo con nome String
In Elixir, voglio chiamare una funzione specifica sui moduli, dato il nome del modulo come stringa.
Ho il seguente codice (molto male) di lavoro, che fa più o meno quello che voglio:
module_name = elem(elem(Code.eval_file("module.ex", __DIR__), 0), 1)
apply(module_name, :helloWorld, [])
Questo (almeno se ho capito bene) compila il modulo (già compilato) di module.ex
nella directory corrente. Sto estraendo il nome dei moduli (non come una stringa, non so quale sia il tipo di dati in realtà) tra le due tuple e eseguo il metodo helloWorld
su di esso.
Ci sono due problemi con questo codice:
stampa un avviso come
redefining module Balance
. Certamente non voglio che ciò accada in produzione.AFAIK questo codice compila
module.ex
. Ma poiché module.ex è già compilato e caricato, non vuole che ciò accada.
Non ho bisogno di chiamare i metodi su questi moduli per nomefile, il nome del modulo sarebbe ok anche. Ma deve essere dinamico, ad es. inserendo "Book" sulla riga di comando, dopo aver verificato se il modulo esiste, chiamare la funzione Book.helloWorld
.
Grazie.
Piccola nota: si consiglia di utilizzare to_existing_atom quando possibile. Gli atomi non sono raccolti! –
Grazie! Non sapevo che gli atomi non sono spazzatura raccolti. Modificherà la mia risposta. – lschuermann