Bài viết này giải thích tự động điền lớp &mô-đun trong Ruby. Bao gồm đá quý “Zeitwerk” mới là một phần của Rails 6.
Hãy bắt đầu với một câu hỏi…
Làm cách nào để chúng ta kết hợp nhiều tệp mã nguồn thành một?
Chúng tôi require
họ.
Yêu cầu một tệp khiến Ruby đọc nó và chạy mã bên trong. Nhưng nếu chúng tôi có danh sách các tệp bắt buộc, chúng tôi có thể không cần tải TẤT CẢ chúng .
Ít nhất là không phải ngay lập tức…
Làm cách nào để chúng tôi có thể tải tệp chỉ khi chúng tôi cần chúng để chúng tôi có thể bắt đầu ứng dụng của mình nhanh hơn?
Đó là lúc tính năng tự động tải lên!
Cách sử dụng tính năng tự động tải
Ruby có một tính năng tự động tải tích hợp.
Nó dựa trên các hằng số.
Khi một hằng số như Coconut
được tìm thấy lần đầu tiên, Ruby sẽ cố gắng tải tệp liên kết của nó.
Nhưng trước tiên :
Bạn cần đăng ký hằng số này bằng tên tệp của nó.
Như thế này :
autoload :Coconut, "lib/coconut.rb"
Giờ đây, Ruby biết nơi để tìm bất cứ khi nào bạn muốn sử dụng Coconut
lớp hoặc mô-đun.
Nhưng bạn biết điều gì sẽ tốt hơn không?
Hãy tưởng tượng nếu bạn không phải đăng ký hằng số theo cách thủ công và Ruby biết chính xác nơi để tìm mọi thứ.
Chà…
Đây là những gì Rails làm, nhưng trước đây Rails 6 nó không sử dụng autoload
này cơ chế.
Tự động tải trong Rails TRƯỚC KHI Rails 6
Tôi không hiểu đầy đủ về cách nó hoạt động, nhưng Rails sử dụng const_missing
, thay vì autoload
để tự động tìm và tải tệp vào dự án của bạn.
Tại sao điều đó lại hữu ích?
Bởi vì nó có nghĩa là bạn không phải sử dụng require
trong các dự án Rails của bạn.
Quy ước về cấu hình…
Tất cả diễn ra tự động, miễn là bạn tuân theo các quy tắc.
Các quy tắc là :
- Đặt tệp của bạn ở nơi có thể tìm thấy nó (như được định nghĩa bởi
ActiveSupport::Dependencies.autoload_paths
) - Xác định một lớp / mô-đun cho mỗi tệp
- Đặt tên tệp theo tên lớp, sử dụng dấu gạch dưới (
UsersController
=>users_controller
)
Sau đó…
Bất cứ khi nào mã của bạn tham chiếu đến bất kỳ tên lớp nào trong số này, Rails sẽ biết tìm chúng ở đâu.
Rất hữu ích.
Tự động tải trong Rails SAU KHI Rails 6
Rails 6 giới thiệu một cơ chế tự động tải liên tục mới.
Nó được gọi là Zeitwerk.
Điều này khác với tự động tải Rails “cổ điển” như thế nào?
Không giống như const_missing
phương pháp tiếp cận được sử dụng bởi các phiên bản Rails cũ hơn, thiếu thông tin - như lồng mô-đun - dẫn đến một số hạn chế.
Zeitwerk sử dụng autoload
của Ruby .
Triển khai mới này tuân theo các quy ước đặt tên tệp tương tự.
Thực tế :
Zeitwerk sử dụng tên tệp để suy ra tên lớp, users_controller
=> UsersController
.
Điều này hoàn toàn trái ngược với trước đây.
Btw, bạn vẫn có thể sử dụng autoload_paths
, nhưng bạn chỉ muốn thêm các đường dẫn BASE, như "/lib"
, thay vì "/lib/**"
.
Tại sao?
Đó là cách điều này hoạt động với không gian tên và lồng nhau.
- Nếu bạn có
"lib"
trong tự động tải và bạn muốn xác định"Fruit::Orange"
, thì tên tệp phải là"lib/fruit/orange.rb"
. - Nhưng nếu bạn có
"lib/fruit"
trong autoload, sau đó bạn sẽ phải sử dụng một thư mục khác, vì vậy tên tệp của bạn sẽ trở thành"lib/fruit/fruit/orange.rb"
cho cùng một lớp.
Phần tốt nhất?
Chức năng mới này không gắn liền với Rails, vì vậy bạn có thể sử dụng nó trong các dự án không phải Rails của mình!
Tóm tắt
Bạn đã tìm hiểu về tính năng tự động tải mô-đun trong Ruby, chính xác nó là gì và nó hoạt động như thế nào!
Với sự hiểu biết mới này, bạn sẽ có thể cấu trúc các dự án Ruby của mình theo cách hiệu quả nhất.
Đến lượt bạn, mở trình chỉnh sửa của bạn và vui chơi.
Cảm ơn vì đã đọc! 🙂