Czy require
idempotentny? tj. zrobić
(require 'helm)
i
(require 'helm)
(require 'helm)
skończyć z tym samym rezultatem?
Tak. Z Nazwanych funkcji (moje podkreślenie):
Nazwa funkcji jest symbolem, który oznacza zbiór funkcji, zmiennych itp. Plik, który je definiuje, powinien zawierać tę funkcję. Inny program, który ich używa, może upewnić się, że zostały zdefiniowane przez wymaganie tej funkcji. Spowoduje to załadowanie pliku definicji, jeśli nie został jeszcze załadowany.
Aby wymagać obecności obiektu, wywołaj go
require
z nazwą obiektu jako argumentem.require
sprawdza zmienną globalną,features
aby sprawdzić, czy żądana funkcja została już udostępniona. Jeśli nie, ładuje funkcję z odpowiedniego pliku . Ten plik powinien wywoływaćprovide
na najwyższym poziomie, aby dodać funkcjęfeatures
; jeśli tego nie zrobi,require
sygnalizuje błąd .
Tak, pod warunkiem, że kod jest zgodny z regułą, którą musi wywołać,
helm.el
lub jest z nimhelm.elc
zgodny(provide 'helm)
. Wywołanie(provide 'helm)
oznacza symbolhelm
jako załadowaną funkcję , co powoduje, że drugie połączenie(require 'helm)
nic nie robi.Jeśli załadowany pakiet nie wywołuje
provide
następnierequire
sygnalizuje błąd, a funkcja nie jest oznaczony jako załadowany, więc drugie wywołanie(require 'helm)
znowu próbować ładowania (i zazwyczaj nie ponownie z tego samego powodu).źródło