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