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)
