Project

General

Profile

Actions

Bug #8346

closed

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

Added by alexeymuranov (Alexey Muranov) almost 11 years ago. Updated almost 11 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
2.0.0
[ruby-core:54690]

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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0