Cơ bản về Module trong Ruby

Toàn Đinh
Edumall Engineering
3 min readMar 31, 2019
Tìm hiểu về Module trong Ruby

Module trong ruby là gì?

Module là một tập các lớp, phương thức, hằng số do đó module cũng giống như các class. Chỉ khác là module không thể tạo các đối tượng và không thể kế thừa. Module là một trong những công cụ mạnh nhất của ruby on rails, nó được sử dụng như namespace của class trong ruby. Thường thì chúng ta sẽ gộp các lớp, phương thức và hằng số có liên quan đến nhau vào một module để tránh xung đột tên.

Cách khai báo và sử dụng

Khai báo

Cách mà chúng ta tạo ra một module trong ruby thực sự rất đơn giản

Cách sử dụng method trong module

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.

Cách 1: Mixin và dùng như instance method

Cách 2: Dùng theo kiểu module function

Ngoài ra bạn có thể kết hợp cả 2 cách:

Cách sử dụng module trong class

Đế sử dụng được các module trong class chúng ta thường có 2 cách đó là “include” hay “extend” những module này vào trong class đó. Khi đó các class có thể truy cập các phương thức ở trong module.

  • include: khi ta sử dụng include module vào trong class thì các phương thức trong module sẽ được xem như là các instance method trong class.
  • extend: khi ta sử dụng extend module vào trong class thì các phương thức trong module sẽ được xem như là các class method trong class.

So sánh sự khác nhau giữa class method và instance method

Để hiểu rõ hơn cách sử dụng module trong class chúng ta sẽ tìm hiểu thêm về sự khác nhau giữa class method và instance method. Class method là method mà được gọi trên một lớp, còn instance method là method mà được gọi trên thể hiện của một lớp.

Qua ví dụ đơn giản trên, ta thấy sự khác biệt giữa 2 phương thức bar và baz. bar là một class method nên khi ta gọi Foo.bar thì nó hoạt động tốt nhưng baz lại là một instance method dó đó khi ta gọi Foo.baz thì lập tức ruby sẽ bắn ra một exception là NoMethodError.

Tiếp theo ta sẽ gọi hai method trên trên một thể hiện của lớp (Foo.new) thì ta sẽ thấy kết quả ngược lại với khi ta gọi chúng ngay trên lớp đó.

Tổng kết

Bài viết trên chỉ là hiểu biết cơ bản của mình về module, mong là có thể giúp ích một phần nhỏ cho các bạn Tham khảo:

http://tutorials.jumpstartlab.com/topics/models/modules.html

--

--