Module trong Ruby

1. Giới thiệu

Một trong những công cụ mạnh nhất của Ruby on Rails là Module. Vậy module là gì?

Module là một tập các phương thức, lớp, hằng số, do đó module cũng gần giống như class, chỉ khác là module không thể tạo các đối tượng và không thể thừa kế.

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 với nhau vào một module để tránh xung đột tên. Nếu bạn đã từng làm việc với C# và Java thì có thể nói module trong Ruby tương đương với namespace trong C#package trong Java vậy.

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

Dưới đây, là cách mà chúng ta tạo ra một module ở trong Ruby. Thực sự rất rất đơn giản.

module MyFirstModule
  def say_hello
    puts “Hello, I am a Module”
  end
end

Trong Ruby, có 2 cách sử dụng method của module:

  • mixin - nhúng và dùng như instance method
  • module function
// Cách 1:

Class Greeter
  include MyFirstModule
end

// Cách 2:

module MyFirstModule
  def self.say_hello
    puts “Hello, I am a Module”
  end
end

// Khi vừa muốn được mixin và muốn được sử dụng như module function
module MyFirstModule
  def self.say_hello
    puts “Hello, I am a Module”
  end

  module_function :say_hello
end

class Greeter
  include MyFirstModule
end

 // Call method:
Greeter.new.say_hello
MyFirstModule.say_hello

Để sử dụng được các method của module ở trong các class chúng ta thường include hay extend những module này vào trong các class đó. include hay extend module vào trong một class, nghĩa là class đó có thể access các phương thức được khai báo ở trong module.

  • include: mixes các method ở module như là instance method trong class.
  • extend: mixes các method ở module như là class method trong class.
class A
  include  MyFirstModule
end

class B
  extend  MyFirstModule
end

=> call method of module
A.new.say_hello
B.say_hello

Bài viết này chỉ dừng lại ở việc giới thiệu chung ở mức cơ bản về cách khai báo và sử dụng module. Hi vọng bài viết sẽ hữu ích.

Thanks for your reading!

Tham khảo: http://tutorials.jumpstartlab.com/topics/models/modules.html


All Rights Reserved