Ruby Modules

Objetives

Modules

# Syntaxes

module ModuleName
  # Bits 'n pieces
end
# Syntaxes

module MyLibrary
  BOOK = 'Zelda'
end

Namespacing

# Namespacing

module Circle
  PI = "hi!"
end

puts Math::PI
puts Circle::PI

Require

# Syntaxes

require_relative 'module-file-name'
require "./module-file-name"
# perimeter.rb
module Perimeter
  class Array
    def initialize
      @size = 400
    end
  end
end

# main.rb
require_relative "perimeter"

our_array = Perimeter::Array.new
ruby_array = Array.new

p our_array.class
p ruby_array.class

Include

# Include

class Angle
  include Math
  attr_accessor :radians
  attr_reader :pi
  
  def initialize(radians)
    @radians = radians
    @pi = PI
    # @pi = Math::PI
  end
  
  def cosine
    cos(@radians)
    # Math::cos(@radians)
  end
end

p acute = Angle.new(1)
p acute.cosine
p acute.pi

Mixins

# Mixins

module MartialArts
  def swordsman
    "I'm a swordsman."
  end
end

module Greeting
  def say_hello
    "Hello!"
  end
end

class Ninja
  include MartialArts
  def initialize(clan)
    @clan = clan
  end
end

class Samurai
  include MartialArts
  include Math
  include Greeting

  attr_reader :pi

  def initialize(clan)
    @clan = clan
    @pi = PI
  end
end

person = Samurai.new('fua')
p person.swordsman
p person.pi
p person.say_hello

Example!

# Modules & Classes & Require

# action.rb
module Action
  def jump
    @distance = rand(4) + 2
    puts "I jumped forward #{@distance} feet!"
  end
end

# main.rb
require_relative "action"

class Rabbit
  include Action
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

class Cricket
  include Action
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

peter = Rabbit.new("Peter")
juan = Cricket.new("Juan")

peter.jump
juan.jump

Extends

# Extends

module ThePresent
  def now
    puts Time.now
  end
end

class TheHereAnd
  extend ThePresent
end

TheHereAnd.now

Quick Review

# Quick Review

module UsefulThings
 def useful_thing_1
  "thing_1"
 end
end

class A
 include UsefulThings
end

class B
 extend UsefulThings
end

p A.new.useful_thing_1 # => "thing_1"
p B.useful_thing_1 # => "thing_1"

Ruby Modules

By Paulo Tijero

Ruby Modules

  • 88