Project

General

Profile

Feature #11927

Return value for `Module#include` and `Module#prepend`

Added by sawa (Tsuyoshi Sawada) almost 4 years ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:72617]

Description

Currently, Module#include and Module#prepend return the receiver, regardless of whether the ancestor chain has been modified. It is not straightforward to know whether it actually had effect.

module A; end
module B; end
A.include B # => A
A.ancestors # => [A, B]
A.prepend B # => A
A.ancestors # => [A, B]

I propose that, when Module#include and Module#prepend have no effect, they should either:

(1) return nil
(2) return false, or
(3) raise an exception

This is similar to Kernel#require, which returns false when it has no effect. To make it parallel with Kernel#require, it might be even better to return true when Module#include and Module#prepend have effect, and false otherwise. It makes not sense to return the receiver because that is known.

Some relevant cases with expectations are:

  • prepend after include
module A; end
module B; end
A.include B # => A/true
A.prepend B # => nil/false/exception
  • include after prepend
module A; end
module B; end
A.include B # => A/true
A.prepend B # => nil/false/exception
  • include/prepend after include/include at superclass
class A; end
module B; end
A.include M # => A/true
class B < A; end
B.include M # => nil/false/exception

Also available in: Atom PDF