Module in Ruby language

In Ruby, modules are similar to classes. They may hold a collection of constants, class variables, and methods.

Important points to remember:

  • A Module can not be instantiated, i.e., it is not possible to create objects from a module.
  • We cannot inherit modules nor can we create a subclass of module.
  • Modules can be used as namespaces and as mixins.
  • A module name must start with capital letter.
  • Modules can be included into classes, which makes its methods available to the instances of those classes.
Module is also used to make code modular where common methods are kept in module and then these methods can be used by any class who require those methods. It enables Ruby to take advantage of the DRY (Don't Repeat Yourself) principle.

Syntax

module ModuleName
  #  constants
  CONSTANT1 = 'value1'
  CONSTANT2 = 'value2'
  # methods (will act as instance method when included by class)
  def method_1
    # ...
  end
  def method_2
    # ...
  end
  # module methods
  def self.method_1
    # ...
  end
  def self.method_2
    # ...
  end
end

Example

module Shape
  PI = 3.14

  def self.circle_area(radius)
    PI * radius**2
  end

  def self.square_area(side)
    side * side
  end
end

Shape.circle_area(5)  # output: 78.5
Shape.square_area(5)  # output: 25

Including Module in Class

The common usage of module is to include it inside a class allowing to share common functionalities between classes. This concept is also known as mixin. It eliminates the need for multiple inheritance which we will see in later.

module HelperMethods
  def display
    puts "Showing display of #{self.class}"
  end
end

class MyClass1
  include HelperMethods
end

class MyClass2
  include HelperMethods
end

puts "MyClass1 display: "
object1 = MyClass1.new
object1.display

puts "MyClass2 display: "
object2 = MyClass2.new
object2.display

# output
Showing display of MyClass1
Showing display of MyClass2
If the module is defined in another file, then it is required to include that file before embedding it in class using the `require` method.

Module as Namespace

A namespace in programming is a way of grouping logically related entities together. In Ruby, using a module is a convenient way to achieve it. It allows us to avoid colliding with existing classes and modules, and other constants, that exist together.

Example:

module Fruit
  class Array
    def show
      puts "Fruit's Array"
    end
  end
end

module Shape
  class Array
    def show
      puts "Shape's Array"
    end
  end
end

Fruit::Array.new.show
Shape::Array.new.show

Output:

Fruit's Array
Shape's Array

Help me to improve Gorkha Dev.