11/08/2018, 21:13

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.

0