Issue #11927 has been reported by Tsuyoshi Sawada.

----------------------------------------
Feature #11927: Return value for `Module#include` and `Module#prepend`
https://bugs.ruby-lang.org/issues/11927

* Author: Tsuyoshi Sawada
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
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.

~~~ruby
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

~~~ruby
module A; end
module B; end
A.include B # => A/true
A.prepend B # => nil/false/exception
~~~


* include after prepend

~~~ruby
module A; end
module B; end
A.include B # => A/true
A.prepend B # => nil/false/exception
~~~

* include/prepend after include/include at superclass

~~~ruby
class A; end
module B; end
A.include M # => A/true
class B < A; end
B.include M # => nil/false/exception
~~~



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>