Giới thiệu hàm Module#module_function
Trong Ruby, có 2 cách sử dụng method của module. Cách thứ nhất là 'nhúng' (mixin) và dùng như instance method và cách thứ hai là dùng theo kiểu module function. Sẵn tiện tôi cũng đưa ra 2 ví dụ cụ thể cách dùng: Mixin và dùng như instance methods module MyLibrary def hello puts "Hello ...
Trong Ruby, có 2 cách sử dụng method của module. Cách thứ nhất là 'nhúng' (mixin) và dùng như instance method và cách thứ hai là dùng theo kiểu module function. Sẵn tiện tôi cũng đưa ra 2 ví dụ cụ thể cách dùng:
Mixin và dùng như instance methods
module MyLibrary def hello puts "Hello world" end end class Greeter include MyLibrary end Greeter.new.hello # => Hello world
Các bạn có thể thấy là hàm #hello được gọi thông qua object của Greeter. Đây là cách phổ biến mà người viết Ruby hay dùng để chia sẻ code giữa các class với nhau thay vì dùng class inheritance.
module functions
Tương tự như cách sử dụng class methods, module cho phép gọi hàm với receiver là module. Xem ví dụ sau:
module MyLibrary def self.hello puts "Hello world" end end MyLibrary.hello # => Hello world
Xin lưu ý là tôi định nghĩa hàm này với từ khoá .self để chỉ ra là hàm này thuộc về module.
Kết hợp cả hai
Nếu bây giờ bạn có một hàm trong module và bạn vừa muốn nó được dùng trong mixin và vừa muốn dùng nó như module function thì làm thế nào? Cách đơn giản nhất là viết như sau:
module MyLibrary def self.hello puts "Hello world" end def hello MyLibrary.hello end end
Các bạn có thể thấy cách tôi gọi ngược lại module function MyLibrary.hello. Nhưng có một cách khác đẹp hơn, đó là sử dụng hàm Module#module_function:
module MyLibrary def hello puts "Hello world" end module_function :hello end class Greeter include MyLibrary end Greeter.new.hello # => Hello world MyLibrary.hello # => Hello world
Ruby cung cấp hàm trên với param là tên của method bạn muốn biến thành module_function.
Còn rất nhiều các hàm khác của Ruby giúp rút ngắn và làm code súc tích và dễ hiểu hơn. Tôi sẽ ráng viết thêm một số bài tương tự trong thời gian tới.