reminder : ruby include vs require
Written by Walter on 21/1/2011
Sometimes I mess these up (by switching programming in C++ ruby, python and other languages). Just put this into a post as a quick memory reminder.
In short, require is like include in C/C++
Ruby's include is really handy to inject a module's members into a class (great for writing gems). Finally you can also just extend a class instance with some functionality from a module by using 'extend'. Below is an example that uses these concepts:
$ cat engine.rb module Engine def start puts "vroem vroem" end end $ cat include_vs_require.rb require "./engine.rb" class Car include Engine def initialize( name ) @name = name end def brand @name end end module BadEngine def start puts "prutel prutel" end end puts "The audi class instance uses the engine injected with include" audi = Car.new("Audi TT") puts audi.brand audi.start puts "The opel class instance uses a different module that is injected solely for this object instance" opel = Car.new("Opel") puts opel.brand opel.extend BadEngine opel.start
At runtime we see how it all goes works here with ruby requires and includes :
$ ruby include_vs_require.rb "The audi class instance uses the engine injected with include" "Audi TT" "vroem vroem" "The opel class instance uses a different module that is injected solely for this object instance" "X5" "prutel prutel"
Basically a module is like a c++ namespace equivalent (not really but it serves a similar purpuse not polluting the main scope).
In ruby you can also nest classes and modules inside eachother as much as you like (not possible in C or java ;) ).