Sanjay Salunkhe
Sanjay Salunkhe

Reputation: 2735

Why module included outside the class adds instance methods to class's objects

I am experimenting with the Ruby include keyword as shown below:

module A
    def show
    puts "working"
    end
end

include A

class E
end

class D
end

e = E.new
d = D.new
e.show
d.show

o = Object.new
puts o.respond_to?("show")

******************************output****************

working
working
true

I was expecting output to be undefined method but it's giving me the proper output. I have also observed that the show method defined in module A is becoming an instance method of Object.

Why are these methods becoming instance methods of the class Object? Please help in understanding this concept.

Upvotes: 3

Views: 322

Answers (1)

Andrey Deineko
Andrey Deineko

Reputation: 52357

Because instances of class Class inherit from Object.

Thus, modules, included into Object are available to instances of Class's instances (instances of your E and D classes).

class A
end

module B
  def test; :hi end
end
#=> test

include B
#=> Object

A.new.test
#=> :hi

Object.new.test
#=> :hi

Having include B written in the top-level means include'ing B into Object.

include B is the outermost context is equivalent to:

class Object
  include B
end

The only class, whose instances do not share module B's methods is BasicObject.

Upvotes: 3

Related Questions