Modules

Ref. WGR Chapter 4, Modules and program organization

Modules as namespaces

module Food
  FRUITS = ["Apple", "Banana", "Cherry"]
end

From outside the module:

Food::FRUITS.each do |fruit|
  puts "This #{fruit} is yummy!"
end

Modules as namespaces for classes

module Speakers
  class Hello
    def say_hello
      puts "hi"
    end
  end
end

From outside the module:

x = Speakers::Hello.new
x.say_hello

Modules as mixins

module Greetings
  def greet
    puts "Hello!"
  end
end

Module usage

class Person
  include Greetings
end

alice = Person.new
alice.greet

Multiple modules

Modules cannot be instantiated

Greeter.new #=> undefined method `new' for Greeter:Module

Modules have no state

but they can fake it pretty well

module Stacky
  def stack
    @stack ||= []
  end
  def push obj
    stack.push obj
  end
  def pop
    stack.pop
  end
end

@stack will become an instance variable on the includer

load vs. require vs. include vs. extend

module lookup gotchas

class Foo
  include A
  include B
  include A  #<< ignored!
end

Using Modules for Organization

Module Organization Example

whiz.rb:

module Whiz
  VERSION = "1.0.2"
  class GeeGaw
    # ...
  end
end

whiz/bang.rb:

module Whiz
  class Bang
    def geegaw
      # inside the module, its members are in scope
      @geegaw ||= GeeGaw.new
    end
  end
end

client.rb:

require "whiz"
require "whiz/bang"

outside the module, its members are not in scope

you need to name it explicitly

puts Whiz::VERSION bang = Whiz::Bang.new ```

 Previous Lesson Next Lesson 

Outline

[menu]

/