2015-03-17 15 views
8

Sospetto che sia una domanda elementare, ma è stato difficile trovare una risposta concisa e canonica online.Elixir - Cosa fa la parola chiave 'use'?

Da quel poco che capisco;

  • È distinto sia 'necessita' e 'importazione'
  • 'utilizzato per importare il contenuto di moduli.
  • E 'una macro

Qualcuno può chiarire?

+1

Per quel che vale @SasaJuric ha fatto un eccellente serie di post di blog su macro e si copre la dichiarazione uso in modo approfondito qui: http : //www.theerlangelist.com/2014/06/understanding-elixir-macros-part-2.html –

+1

Perché c'è un tag Erlang su questo? – zxq9

+0

Capito che potrebbe esserci un discreto numero di persone interessate a entrambe le lingue. Inoltre non si poteva essere sicuri che esistesse una funzionalità equivalente in Erlang stesso, o che fosse una macchina virtuale. – Charlie

risposta

20

It require s il modulo specificato e quindi chiama il callback __using__/1 su di esso consentendo al modulo di iniettare del codice nel contesto corrente. Vedi http://elixir-lang.org/docs/v1.0/elixir/Kernel.html#use/2.

Esempio:

defmodule Test do 
    use Utility, argument: :value 
end 

è circa la stessa di

defmodule Test do 
    require Utility 
    Utility.__using__(argument: :value) 
end 
+0

Cheers per la risposta. Una domanda successiva ... Quando usi Mix per configurare una nuova app OTP, devo 'richiedere/utilizzare/importare' i moduli che creo nella cartella/lib? perché dopo averlo compilato, sembra che io possa (per esempio) chiamare A.B.method da A.C senza una direttiva di importazione esplicita. – Charlie

+3

'require' non ha nulla a che fare con le funzioni, rende solo le macro dal modulo' require'd disponibili allo scope lessicale corrente. http://elixir-lang.org/getting-started/alias-require-and-import.html –

+1

Fintanto che i tuoi file sono compilati puoi chiamare qualsiasi funzione specificando 'Module.function_name' completamente. Se si utilizza l'importazione, è possibile utilizzare 'function_name' omettendo il' Module' che potrebbe essere più pulito per i casi in cui si utilizzano le funzioni di un determinato modulo molto in alcuni file, ad esempio. –