Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành Thạo Zeitwerk: Hướng Dẫn Chuyên Gia Về Autoload Module Ruby

Bài viết giải thích autoload class & module trong Ruby. Bao gồm gem mới "Zeitwerk" là một phần của Rails 6.

Hãy bắt đầu với một câu hỏi... Làm sao chúng ta gộp nhiều file source code thành một? Chúng ta require chúng. Require file làm Ruby đọc & chạy code bên trong. Nhưng nếu có danh sách file require, chúng ta có thể KHÔNG CẦN load TẤT CẢ. Ít nhất không ngay lập tức... Làm sao load file chỉ khi cần để app khởi động nhanh hơn? Đó là lúc autoload xuất hiện!

Cách Sử Dụng Autoloading

Ruby có tính năng autoloading built-in. Nó dựa trên hằng số (constant). Khi hằng số như Coconut được tìm thấy lần đầu, Ruby sẽ cố load file liên kết. Nhưng trước tiên: Bạn cần đăng ký hằng số này với tên file. Như sau:

 autoload :Coconut, "lib/coconut.rb" 

Bây giờ Ruby biết tìm đâu khi bạn muốn dùng class/module Coconut. Nhưng điều còn tốt hơn? Tưởng tượng nếu không phải đăng ký hằng số thủ công & Ruby biết chính xác nơi tìm mọi thứ. Vâng... Đây là điều Rails làm, nhưng TRƯỚC Rails 6 nó không dùng cơ chế autoload này.

Autoloading Trong Rails TRƯỚC Rails 6

Tôi không hiểu hoàn toàn cách hoạt động, nhưng Rails dùng const_missing, thay vì autoload để tự động tìm & load file vào dự án. Tại sao hữu ích? Vì bạn không phải dùng require trong dự án Rails. Convention over configuration... Tự động xảy ra, miễn bạn tuân thủ quy tắc.

Quy tắc là:

  1. Đặt file nơi có thể tìm thấy (theo ActiveSupport::Dependencies.autoload_paths)
  2. Định nghĩa một class/module mỗi file
  3. Đặt tên file theo tên class, dùng underscore (UsersController => users_controller)

Khi code tham chiếu tên class này, Rails biết nơi tìm. Rất hữu ích.

Autoloading Trong Rails SAU Rails 6

Rails 6 giới thiệu cơ chế autoload hằng số mới. Tên là Zeitwerk. Khác biệt như thế nào so với autoload "classic" Rails? Khác với cách const_missing dùng bởi Rails cũ, thiếu thông tin như module nesting dẫn đến nhiều hạn chế, Zeitwerk dùng autoload của Ruby. Triển khai mới tuân theo quy tắc đặt tên file tương tự. Thực tế: Zeitwerk dùng tên file để suy ra tên class, users_controller => UsersController. Đúng ngược lại trước đây. Bạn vẫn dùng autoload_paths, nhưng chỉ thêm BASE path như "/lib", không phải "/lib/**".

Tại sao? Cách nó hoạt động với namespace & nesting. Nếu bạn có "lib" trong autoload, muốn định nghĩa "Fruit::Orange", file phải là "lib/fruit/orange.rb". Nhưng nếu bạn có "lib/fruit" trong autoload, bạn phải dùng thư mục khác, file thành "lib/fruit/fruit/orange.rb" cho cùng class. Phần tốt nhất? Chức năng mới không gắn liền với Rails, bạn dùng cho project non-Rails!

Tóm Tắt

Bạn đã học về autoload module trong Ruby, chính xác nó là gì & cách hoạt động! Với hiểu biết mới, bạn cấu trúc project Ruby hiệu quả nhất. Lượt của bạn, mở editor & vui vẻ thôi. Cảm ơn bạn đã đọc! 🙂