Khi nào tôi nên sử dụng tự động tải thay vì yêu cầu?


30

Từ những gì tôi hiểu requiređược sử dụng để tải các đoạn mã lớn (giống như các mô-đun) mặc dù nó cũng có thể tải các chức năng riêng lẻ.

Tự động tải ở phía bên kia, chỉ đăng ký các chức năng và trì hoãn việc tải đến thời gian thực hiện.

Gần đây tôi đã đọc một bài báo ủng hộ việc sử dụng autoloadđộc quyền.

Nó là tốt autoloadhơn để require? Một số trường hợp sử dụng điển hình cho mỗi trong số này là gì?


3
@Gilles: FWIW, tôi không đồng ý với việc bạn đã xóa các thẻ autoloadrequiretừ câu hỏi này. Thêm thẻ librarieslà tốt, nhưng bây giờ bất cứ ai tìm kiếm, sử dụng thẻ, cho câu hỏi về autoloadhoặc requiresẽ không tìm thấy thẻ này. Đó là cả hai chức năng Emacs-Lisp quan trọng mà mọi người sẽ tìm kiếm. Quá tệ. Và nghĩ rằng sẽ hữu ích như thế nào elisplibraries(đặc biệt elisp) sẽ thực sự hoạt động như thế nào đối với một trang web Emacs: họ không phân biệt nhiều ở Emacsland, tôi sợ. (Nhưng không, tôi không chống lại việc có chúng và sử dụng chúng.)
vẽ

@Drew Tôi sẽ tham gia thảo luận meta áp dụng . Nếu bạn nghĩ rằng nguyên tắc chung này không áp dụng ở đây, vui lòng nâng nó lên meta.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles: Xong rồi . Vâng, tôi đã đọc nó và nhận ra rằng đó có lẽ là điều đã thúc đẩy bạn. Tôi không đồng ý với nhiều nguyên tắc chung. Điều đó không có nghĩa là theo dõi họ theo cách chăn luôn là TRT.
vẽ

2
Tôi đồng ý với Drew: vì câu hỏi này đặc biệt về cách phân biệt các trường hợp sử dụng autoloadrequiretôi nghĩ những thẻ đó là hợp lý. Trong thực tế, ghi nhãn câu hỏi này [chỉ] với librarieslà quá khái quát. Tôi cho một lần sử dụng requiređể kích hoạt tải "my-foobar-cfg", như tên cho thấy, chỉ chứa cấu hình của tôi, không phải thư viện.
paprika

Câu trả lời:


28

autoloadkhông phải là một thay thế cho require. Thông thường requiređược sử dụng để đảm bảo rằng một tập tin nhất định được tải. autoloadmặt khác cung cấp cho Emacs một gợi ý trong đó tập tin cần tìm một chức năng nhất định mà không cần tải tập tin ngay lập tức. Chỉ khi chức năng tự động tải được gọi là tệp tương ứng được tải.

Về cơ bản với autoloadbạn có thể trì hoãn việc tải toàn bộ tệp đến thời điểm bạn thực sự cần nó. Đây là lý do tại sao các gói (đặc biệt lớn) thường xác định các hàm nhập của chúng là autoloads.

Nếu bạn muốn thực hiện các tùy chỉnh nặng cho một gói thường thì bạn không gặp may autoload. Nếu bạn vẫn muốn tránh requirethì bạn có thể trì hoãn các tùy chỉnh của mình cho đến khi tệp được tải bằng cách sử dụng eval-after-load.

Hướng dẫn sử dụng Emacs bao gồm chủ đề này trong các phần sau:


2
Có lẽ cũng đáng đề cập: autoloadlà (ít nhiều) về việc cung cấp các định nghĩa lệnh, vì vậy bạn có thể sử dụng các lệnh đó. requirelà về việc làm cho mọi thứ trong một thư viện (và trong các thư viện mà thư viện yêu cầu, đệ quy) có sẵn. Có nhiều thứ để Emacs hơn các lệnh. (Nhưng vâng, tất nhiên một khi lệnh được tải tự động được gọi, toàn bộ thư viện của nó được tải.)
vẽ

4

Về mặt khởi tạo Emacs, đừng lựa chọn. Người dùng GitHub jwiegley có macro khai báo gói sử dụng tuyệt vời , sẽ yêu cầu hoặc tự động tải một gói theo xác định theo nhu cầu. Sử dụng tốt nhất để trì hoãn việc tải các gói có thể được tải theo yêu cầu.


3

Nếu bạn muốn một tính năng nhất định được tải và có sẵn trực tiếp khi Emacs của bạn đã bắt đầu, hãy sử dụng yêu cầu, nếu không hãy sử dụng tự động tải. Cá nhân tôi rất coi trọng thời gian khởi động (tôi thực sự khởi động lại Emacs một vài lần mỗi tuần, đôi khi vài lần mỗi ngày), vì vậy tôi chấp nhận rằng sẽ mất một chút thời gian khi Emacs tự động tải một chức năng nhất định khi tôi cần. Vì vậy, hãy suy nghĩ về những gì bạn muốn có sẵn trực tiếp sau khi Emacs được bắt đầu và những gì có thể được tải khi cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.