Feature #12534
closed
Refinements: refine modules as well
Added by chucke (Tiago Cardoso) over 8 years ago.
Updated about 8 years ago.
Description
Refinements were added as a feature to scope monkey-patches on ruby core elements. This works for elements such as String, Array (all classes), but not for modules (Enumerable, Timeout...).
This might be related to refinements not working for singleton classes (for example, I can't define a class method inside a refine block).
This code is evaluated, but the method is undefined:
module Extension
refine Array do
def self.foo ; puts "bar" ; end
end
end
This code breaks:
module Extension
refine Kernel do
def foo ; puts "bar" ; end
end
end
Interesting. I was not aware of this.
It is however mentioned in the documentation:
http://ruby-doc.org/core-2.3.1/doc/syntax/refinements_rdoc.html
Quote:
"Refinements only modify classes, not modules so the argument must be a class."
As to why, I don't know either. Perhaps the documentation can add some words
to briefly state whether this is on purpose or not.
- Status changed from Open to Feedback
- Assignee set to shugo (Shugo Maeda)
There is an implementation difficulty when refining modules and calling super
in that refinement.
One solution is prohibiting super
in a refinement for a module.
Other proposals (and patches) are welcome.
I understand the implementation difficulty. If we prohibit super
in refined methods in Modules, is it possible to refine modules?
If it's reasonably possible, I'd like to accept this.
Matz.
- Status changed from Feedback to Closed
Applied in changeset r56213.
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0