2016-01-12 18 views

Odpowiedz

7

Od Erlang documentation:

  • zabawy stworzony przez fun M:F/A nazywamy zewnętrzny zabawa. Wywołanie go zawsze wywoła funkcję F z zapisem A w najnowszym kodzie dla modułu M. Zauważ, że moduł M nie musi być ładowany, gdy tworzona jest zabawa fun M:F/A.

  • Wszystkie inne zabawy są nazywane lokalna zabawa. Kiedy lokalna zabawa jest wywoływana, wywoływana jest ta sama wersja kodu, która stworzyła zabawę (nawet jeśli załadowana została nowsza wersja modułu).

Mają różne zachowania w kodzie modernizacji jak mówi dokumentacja. Twój pierwszy moduł używa funkcji lokalnej (fun f/0), a drugi wykorzystuje funkcję zewnętrzną (fun ?MODULE:f/0, która w procesie preprocesingu została zastąpiona przez fun some_mod:f/0).

Jeśli więc aktualizujesz swój pierwszy moduł (który korzysta z funkcji lokalnej), procesy korzystające z funkcji some_fun nie używają nowszej wersji. Ale jeśli uaktualnisz drugi moduł (który korzysta z funkcji zewnętrznej), najnowsza wersja kodu zostanie wywołana, gdy tylko zostanie wywołana some_fun z wewnętrznych procesów, które zostały zainicjowane jeszcze przed załadowaniem nowej wersji.


Wskazówka: Nie może być tylko dwie wersje modułu, stary i nowy. Jeśli trzecia wersja modułu zostanie załadowana, serwer kodu usuwa (usuwa) stary kod, a wszelkie procesy, które w nim trwają, zostają zakończone.

+4

W rzeczywistości, jeśli trzecia wersja modułu zostanie załadowana, wszelkie procesy zachowujące odniesienie do zabawy w starym kodzie (w przypadku "zabawy f/0") również zostaną przerwane. – legoscia

1

?MODULE to predefiniowane makro, które rozwija się do nazwy bieżącego modułu. W Twoim przypadku rozszerzy się do some_mod. Odwołanie do fun f/0 jako fun ?MODULE:f/0 zapewnia użycie nowszej wersji f/0, gdy dostępna jest nowa skompilowana i załadowana wersja some_mod.

Powiązane problemy