Skip to content
Ruby

Classes and Modules

Define classes with inheritance, mix in modules, and add class methods.

#class#module#oop

Code

ruby
# Module as namespace and mixin
module Loggable
  def log(msg)
    puts "[#{self.class}] #{msg}"
  end
end

class Animal
  include Loggable            # instance methods

  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def speak
    raise NotImplementedError
  end
end

class Dog < Animal            # inheritance
  def speak
    log "bark"
    "Woof!"
  end
end

class Cat < Animal
  def speak
    log "meow"
    "Meow"
  end
end

[Dog.new("Rex"), Cat.new("Tom")].each do |a|
  puts "#{a.name}: #{a.speak}"
end

# Class methods and class variables
class Counter
  @@total = 0
  def self.count; @@total; end
  def initialize; @@total += 1; end
end
3.times { Counter.new }
puts "Counters: #{Counter.count}"

# Open class to add a method
class String
  def shout; upcase + "!"; end
end
puts "hello".shout