Here is my small cheatsheet which will help you to extend any Ruby class.
I found out it very helpful and i hope, it will also be a nice help for you.
Ancestor - any superclass of our class. It is a parent of our class, parent of a parent of our class etc.
We can check all ancestors of our class by a calling method:
class Demo; end
Demo.ancestors
=> [Demo, Object, Kernel, BasicObject]
Below you can find all basic types of extending a class in Ruby.
INCLUDE
- An INCLUDE directive let us to include any module inside our Class.
- We can't include class into a class (module is just a group of methods, class generates an object in Ruby)
Example of use:
module Honda
def civic
puts "Honda Civic"
end
end
class Car
include Honda
end
Car.new.civic
=> "Honda Civic"
By using Liskov principle (from SOLID) we can overrite method of a parent or extend its functionality (with using super):
module Honda
def civic
puts "Honda Civic"
end
end
class Car
include Honda
def civic
super
puts "Out of stock"
end
end
Car.new.civic
=> "Honda Civic"
=> "Out of stock"
EXTEND
- takes all the methods from the module and place them inside your class as a class methods
- unlike INCLUDE, EXTEND will not add the module to the ancestors
module Honda
def civic
puts "Honda Civic"
end
end
class Car
extend Honda
end
Car.civic
=> "Honda Civic"
PREPEND
- similar to the INCLUDE, but it changes the order of classes
- if you prepend a module into a class, the class will become a parent of this module so you can use super inside a module
module Honda
def civic
super
puts "Honda Civic"
end
end
class Car
prepend Honda
def civic
puts "Car is not available"
end
end
Car.new.civic
=> "Car is not available"
=> "Honda Civic"