Feature #8571

Refinement inheritance by Module#include

Added by Shugo Maeda about 2 years ago. Updated about 2 years ago.

[ruby-core:55671]
Status:Closed
Priority:Normal
Assignee:Shugo Maeda

Description

Currently, refinements are not inherited by Module#include.
How about to make using to activate refinements in the ancestors of the specified module?

For example,

module A
refine X do ... end
refine Y do ... end
end
module B
refine Z do ... end
end
module C
include A
include B
end

using C
# Refinements in A and B are activated here.

In this code,

using C

is equivalent to

C.ancestors.reverse_each { |m| using m }

This feature enables you to distribute refinements into different modules, and then package the refinements into one module.

Please note that Module#include does't activate refinements in the argument module.

For example,

module C
include A
include B

# Refinements in A and B are not activated here.

end

I've implemented this feature, and have attached the patch.

Associated revisions

Revision 41719
Added by Shugo Maeda about 2 years ago

  • eval.c (rb_using_module): activate refinements in the ancestors of
    the argument module to support refinement inheritance by
    Module#include. [Feature #8571]

  • test/ruby/test_refinement.rb: related test.

History

#1 Updated by Yukihiro Matsumoto about 2 years ago

  • Assignee changed from Yukihiro Matsumoto to Shugo Maeda

Agreed. It also conforms the original design.

Matz.

#2 Updated by Shugo Maeda about 2 years ago

  • Status changed from Assigned to Closed

matz (Yukihiro Matsumoto) wrote:

Agreed. It also conforms the original design.

I've committed in r41719. Thanks.

Also available in: Atom PDF