name keywords etiquetas ejemplos description erlang

erlang - keywords - ¿Cuál es la diferencia de funcionalidad entre estos dos bloques de código?



meta tags generator (2)

De la documentación de Erlang :

  • Una diversión creada por fun M:F/A se llama diversión externa . Llamarlo siempre llamará a la función F con arity A en el código más reciente para el módulo M Observe que el módulo M ni siquiera necesita cargarse cuando se crea la divertida fun M:F/A

  • Todas las otras diversiones se llaman diversión local . Cuando se llama a una diversión local, se llama a la misma versión del código que creó la diversión (incluso si se ha cargado una versión más reciente del módulo).

Tienen diferentes comportamientos en la actualización del código como dice la documentación. Su primer módulo usa una función local ( fun f/0 ) y el segundo usa una función externa ( fun ?MODULE:f/0 que en el preprocesamiento reemplazado con fun some_mod:f/0 ).

Por lo tanto, si actualiza su primer módulo (que usa la función local), los procesos que usan la función some_fun no usan la versión más nueva. Pero si actualiza el segundo módulo (que usa una función externa), se llamará a la última versión del código siempre que se some_fun desde procesos internos que se generaron incluso antes de la carga de la nueva versión.

Aviso: puede haber solo dos versiones de un módulo, antiguo y nuevo . Si se carga una tercera versión del módulo, el servidor de códigos elimina (purga) el código anterior y finaliza cualquier proceso que persista en él.

Primero:

-module(some_mod). -compile(export_all). some_fun() -> fun f/0. f() -> ok.

Segundo:

-module(some_mod). -compile(export_all). some_fun() -> fun ?MODULE:f/0. f() -> ok.

Me encontré con este cambio durante una actualización de código caliente. ¿Cuál es la diferencia entre fun ?MODULE:f/0 y fun f/0 ?


?MODULE es una macro predefinida que se expande al nombre del módulo actual. En tu caso, se expandirá a some_mod . Refiriéndose a la fun f/0 como fun ?MODULE:f/0 asegura que se utilizará una versión más nueva, f/0 , siempre que esté disponible una nueva versión compilada y cargada de some_mod .