My employer, Razoo, treated its developers to RailsConf 2010 this year. Very late the second night of the conference (the first night I was there–we skipped the tutorials), I saw Yehuda Katz give an impromptu Birds of a Feather talk about upcoming changes in Rails. It was good, but the thing I remember most clearly was his explanation of include and extend in Ruby. He let code do the explaining:
# a module with a method
module Says
def hello
puts 'hello'
end
end
# a class we want to have the method (not an instance; the class)
class Person
end
# (our end goal)
class Person
def self.hello
puts 'hello'
end
end
# there are two ways to achieve this
# using extend
class Person
extend Says
end
# or using include
class Person
class << self
include Says
end
end
So, in short, include just includes the module’s methods as instance methods and extend includes the module’s methods as class methods. I always do better with examples than reading technical documentation!