#!/usr/bin/ruby -w # include works on Modules, extend on Objects module Mixin def foo puts "foo" end end module Aap def aap puts "aap" end end class Foo include Mixin end ### extend usage 1 f = Foo.new f.foo f.extend(Aap) # mix module Aap in _instance_ f of Foo f.aap g = Foo.new #g.aap # NameError, undefined method aap for Foo ### extend usage 2 class Bar # we're in Class instance Bar's scope, so # add Mixin's methods to Class instance Bar, not to instances of Bar. # essentially: call self.extend on Bar -> we're creating class methods extend Mixin end f = Bar.new p Bar.methods.include?("foo") # true, foo is defined on Class instance Bar p f.methods.include?("foo") # false, foo is not defined on instance f f.class.foo # call foo on Class instance Bar Bar.foo # class method