What is the difference between include and extend in Ruby? This is something that I’ve read a few times but forget shortly thereafter so I’m hoping this blog post will be enough for it to stick forever.
The main difference from what I’ve read is that Include is for making methods in a module accessible inside a class as instance variables. So basically when you include a module all of the instances of that class will have access to those methods.
Extend however, makes those methods into Class methods. Meaning they are not available for the instances of that class, only for the class itself.
Let’s just look at an example to make this more clear.
module Thing
def things
puts "These are all the things"
end
end
class Thang
include Thing
end
my_thang = Thang.new
my_thang.things #=> These are all the things
Thang.things #=> NoMethodError => Why? Because we're calling it as a class method but include turns the Thing methods into intance methods.
class Thung
extend Thing
end
my_thing = Thung.new
my_thing.things #=> NoMethodError => Why? Because we're calling it as an instance method, but extend makes the Thing methods into Class methods.
Thung.things #=> These are all the things
Hopefully these examples clear things up.
TLDR: extend => class methods include => instance methods