Bug #8346

If a module is included, its public instance methods behave like module functions

Added by Alexey Muranov 12 months ago. Updated 12 months ago.

[ruby-core:54690]
Status:Rejected
Priority:Normal
Assignee:-
Category:core
Target version:-
ruby -v:2.0.0 Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

=begin
This behavior is unexpected to me:

module M
def f
1
end
end
include M

M.f # => 1

After including the module (({M})), the method (({f})) becomes an instance method of the module for no apparent reason. I would expect an error (instance method not found).
=end

History

#1 Updated by Alexey Muranov 12 months ago

=begin
Compare with:

module M
def self.f
0
end
def f
1
end
end
include M

M.f # => 0
=end

#2 Updated by Jack Nagel 12 months ago

alexeymuranov (Alexey Muranov) wrote:

=begin
This behavior is unexpected to me:

module M
def f
1
end
end
include M

Here you have included M in Object, which is why the method is now available on M itself.

Object.method_defined?(:f) => true

#3 Updated by Marc-Andre Lafortune 12 months ago

  • Status changed from Open to Rejected

jacknagel (Jack Nagel) wrote:

Here you have included M in Object, which is why the method is now available on M itself.

Indeed. Another way to understand it: the include has the same effect as doing a def foo at the top level.

You can extend M instead of you want to include M only in the global scope and not in Object.

#4 Updated by Alexey Muranov 12 months ago

Ok, thanks for the explanation.

Also available in: Atom PDF