Tính kế thừa (Bài trước)
(Bài tiếp) Struct, OStruct

Module trong Ruby

Module là nơi chứa tập hợp các phương thức có thể được sử dụng lại bởi các lớp. Khai báo module như sau, ví dụ tạo module có tên Namemodule:

module Namemodule
    # khai báo các hàm
end

Để đưa các phương thức của module vào lớp, sử dụng từ khóa include

module Mymodule
  def tong(a, b)
    puts a + b
  end
  def hieu(a, b)
    puts a - b
  end
end

class MyMath
  include Mymodule
end

m = MyMath.new
m.tong(1,2)     # 3
m.hieu(2,3)     # -1

Trong lớp có thể sử dụng gộp vào nhiều module, các module sử dụng theo cách này gọi là các mixins

Mixins trong Ruby

Trong Ruby có sẵn nhiều Mixins định nghĩa sẵn để bạn sử dụng, ví dụ mixin Comparable sử dụng để thêm các toán tử so sánh vào lớp (<, <=, ==, >=, >). Để mixin này hoạt động, cần định nghĩa phương thức <=>

class Cat
  attr_accessor :name, :age
  include Comparable
  def initialize(n, a)
    self.name = n
    self.age = a
  end
  # hàm này định nghĩa hai toán hạng phục vụ cho  Comparable
  def <=>(other)
    self.age <=> other.age
  end
end

c1 = Cat.new("Bob", 3)
c2 = Cat.new("Lucy", 7)
puts c1 < c2 # true

Namespacing trong Ruby

Module ngoài chức năng gộp thành nhóm các phương thức để sử dụng bởi lớp, nó cũng dùng để nhóm các lớp vào một tên module, kỹ thuật này gọi là Namespace. Để truy cập đến một lớp trong Module dùng ký hiệu ::

# Module Mamal định nghĩa hai lớp Dog, Cat
module Mammal
  class Dog
    def speak
      puts "Woof!"
    end
  end

  class Cat
    def speak
      puts "Meow"
    end
  end
end

a = Mammal::Dog.new
b = Mammal::Cat.new

a.speak  # "Woof"
b.speak  # "Meow"

Cách truy cập các lớp trong Module bằng ký hiệu :: cũng được dùng tương tự khi truy cặp hằng số trong Module, truy cập trực tiếp các phương thưc trong module, với phương thức thì có thể dùng . (Modulename.methodname)


Đăng ký nhận bài viết mới
Tính kế thừa (Bài trước)
(Bài tiếp) Struct, OStruct