2016-01-12 7 views

risposta

7

Da Erlang documentation:

  • Un divertente creato da fun M:F/A è chiamato un divertente esterna. La chiamata chiamerà sempre la funzione F con l'asterisco A nell'ultimo codice per il modulo M. Si noti che il modulo M non ha nemmeno bisogno di essere caricato quando viene creato il divertente fun M:F/A.

  • Tutti gli altri giochi si chiamano divertimento locale. Quando viene chiamato un divertimento locale, viene chiamata la stessa versione del codice che ha creato il divertimento (anche se è stata caricata una versione più recente del modulo).

hanno comportamenti diversi nel codice riqualificazione come la documentazione dice. Il primo modulo utilizza una funzione locale (fun f/0) e il secondo utilizza una funzione esterna (fun ?MODULE:f/0 che in pre-elaborazione è stata sostituita con fun some_mod:f/0).

Quindi, se si aggiorna il primo modulo (che utilizza la funzione locale), i processi che utilizzano la funzione some_fun, non utilizzano la versione più recente. Ma se si aggiorna il secondo modulo (che utilizza la funzione esterna), verrà chiamata l'ultima versione del codice ogni volta che some_fun viene chiamato da processi interni che sono stati generati anche prima del caricamento della nuova versione.


Avviso: Non ci può essere solo due versioni di un modulo, vecchia e nuova. Se viene caricata una terza versione del modulo, il code server rimuove (elimina) il vecchio codice e tutti i processi che si fermano in esso sono terminati.

+4

Infatti, se viene caricata una terza versione del modulo, viene interrotto qualsiasi processo che trattiene un riferimento a un divertimento nel vecchio codice (nel caso 'fun f/0'). – legoscia

1

?MODULE è una macro predefinita che si espande al nome del modulo corrente. Nel tuo caso si espanderà a some_mod. Riferendosi a fun f/0 come fun ?MODULE:f/0 si assicura che una versione più nuova f/0 venga utilizzata ogni volta che è disponibile la nuova versione compilata e caricata di some_mod.