In this example, as i understand that included block is running when Exclaimable module is included in Person and after a Person class methods are ‘initialized’
require ‘active_support/concern’
module Exclaimable
extend ActiveSupport::Concern
included do
self.new.hello
end
end
class Person
include Exclaimable
def hello
puts ‘person hello’
end
end
In this example, as i understand that included block is running when Exclaimable module is included in Person and after a Person class methods are ‘initialized’
No. See below for additional information, but if include Exclaimable is the first thing in a class definition, only methods defined on the declaring class’s superclass (Object, in the case of Person) will be available.
require ‘active_support/concern’
module Exclaimable
extend ActiveSupport::Concern
included do
self.new.hello
end
end
class Person
include Exclaimable
def hello
puts ‘person hello’
end
end
But i see that, Person class doesn’t have hello method, why ? Please, help !
The stuff between class Person and end is just code. The hello method isn’t available yet because it hasn’t been DEFINED yet when include Exclaimable executes.
So, i can’t understand - what diifference between
included do
self.new.hello
end
and class method:
self.included(base)
base.new.hello
end
Both code get same error ( see above )
self.included is Ruby’s built-in hook. ( Class: Module (Ruby 2.1.3) ) It gets called when the module that declares it is included in another module or class.
ActiveSupport::Concern adds the included do idiom, to make situations where one module depends on another more straightforward. See the last section of the docs for more: