Bug #8346
closedIf a module is included, its public instance methods behave like module functions
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
Updated by alexeymuranov (Alexey Muranov) almost 11 years ago
Compare with:
module M
def self.f
0
end
def f
1
end
end
include M
M.f # => 0
Updated by Anonymous almost 11 years 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
Updated by marcandre (Marc-Andre Lafortune) almost 11 years 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
.
Updated by alexeymuranov (Alexey Muranov) almost 11 years ago
Ok, thanks for the explanation.