Коли я повинен використовувати автозавантаження замість вимагати?


30

Як я розумію require, використовується для завантаження великих фрагментів коду (щось на зразок модулів), хоча він також може завантажувати окремі функції.

Автозавантаження з іншого боку, лише реєструє функції та відзначає завантаження на час виконання.

Нещодавно я читав статтю, яка виступає за використання autoloadвиключно.

Це краще, autoloadніж робити require? Які типові випадки використання для кожного з них?


3
@Gilles: FWIW, я не згоден з тим, що ви видалили теги autoloadта requireз цього питання. Додавання тегу librariesбуло чудово, але тепер кожен, хто шукає, використовуючи теги, для запитань про це autoloadчи requireне знайде його. Це обидві важливі функції Emacs-Lisp, які люди будуть шукати. Дуже погано. І подумайте, наскільки корисно elispі libraries(особливо elisp) буде на практиці для веб-сайту Emacs: вони бояться не дуже багато в Emacsland, я боюся. (Але ні, я не проти мати їх та використовувати їх.)
Дрю,

@Drew Я йду відповідною мета-дискусією . Якщо ви вважаєте, що цей загальний принцип тут не застосовується, будь ласка, піднесіть його на мета.
Жил "ТАК - перестань бути злим"

1
@Gilles: Готово . Так, я прочитав це і зрозумів, що це, можливо, те, що вас мотивувало. Я не згоден з великою кількістю загальних принципів. Це не означає, що дотримуватися їх за допомогою ковдри - це завжди TRT.
Дрю

2
Я погоджуюся з Дрю: оскільки це питання стосується конкретного розмежування випадків використання, autoloadі requireя вважаю, що ці теги є виправданими. Насправді маркування цього питання [лише] librariesнадмірно узагальнює. Я за одне використання requireдля запуску завантаження "my-foobar-cfg", який, як випливає з назви, містить лише мою конфігурацію, а не бібліотеку.
паприка

Відповіді:


28

autoloadне є заміною require. Зазвичай requireвикористовується для того, щоб переконатися, що певний файл завантажений. autoloadз іншого боку, дає Emacs підказку, в якому файлі знайти задану функцію, не завантажуючи файл відразу. Тільки коли викликається функція автоматичного завантаження, завантажується відповідний файл.

В основному, autoloadви можете затримати завантаження цілого файлу до моменту, коли він вам справді потрібен. Ось чому (особливо великі) пакети зазвичай визначають свої функції введення як autoloads.

Якщо ви хочете зробити великі налаштування для пакету, вам зазвичай не пощастило autoload. Якщо ви все ще хочете цього уникати, requireви можете відкласти налаштування до моменту завантаження файлу за допомогою eval-after-load.

Посібник Emacs висвітлює цю тему в наступних розділах:


2
Можливо, варто також згадати: autoloadце (більш-менш) про надання визначень команд, тому ви можете використовувати ці команди. requireполягає в тому, щоб зробити все в бібліотеці (і в бібліотеках, яких вимагає бібліотека, рекурсивно) доступними. У Emacs є більше, ніж у команд. (Але так, звичайно, коли викликується автоматично завантажена команда, завантажується вся її бібліотека.)
Дрю

4

Що стосується ініціалізації Emacs, не робіть жодного вибору. Користувач GitHub jwiegley має чудовий макрос декларації використання пакета , який вимагатиме або автоматично завантажує пакунок у відповідності з потребою. Найкраще використовується для відстрочки завантаження пакетів, які можна завантажувати на вимогу.


3

Якщо ви хочете, щоб певна функція була завантажена та доступна безпосередньо під час запуску вашого Emacs, використовуйте вимагати, в іншому випадку використовуйте автоматичне завантаження. Я особисто ціную час запуску (я фактично перезапускаю Emacs пару разів на тиждень, іноді кілька разів на день), тому приймаю, що це займе трохи часу, коли Emacs автоматично завантажує певну функцію, коли мені це потрібно. Отже, подумайте про те, що ви хочете бути доступними безпосередньо після запуску Emacs і що можна завантажувати при необхідності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.