[ruby-core:105830] [Ruby master Feature#12533] Refinements: allow modules inclusion, in which the module can call internal methods which it defines.
From:
"jeremyevans0 (Jeremy Evans)" <noreply@...>
Date:
2021-10-27 16:52:37 UTC
List:
ruby-core #105830
Issue #12533 has been updated by jeremyevans0 (Jeremy Evans).
Status changed from Assigned to Closed
`Refinement#include` has been deprecated. `Refinement#import_methods` can now be used to handle this use case:
```ruby
module Extensions
def vegetables ; potatoe ; end
def potatoe ; "potatoe" ; end
end
module Refinary
refine String do
import_methods Extensions
end
end
using Refinary
p ''.vegetables
# => "potatoe"
```
----------------------------------------
Feature #12533: Refinements: allow modules inclusion, in which the module can call internal methods which it defines.
https://bugs.ruby-lang.org/issues/12533#change-94361
* Author: chucke (Tiago Cardoso)
* Status: Closed
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
----------------------------------------
Right now this isn't possible:
~~~ruby
module Extensions
def vegetables ; potatoe ; end
def potatoe ; "potatoe" ; end
end
module Refinary
refine String do
# this doesn't work
include Extensions
# this would work...
# def vegetables ; potatoe ; end
# def potatoe ; "potatoe" ; end
end
end
using Refinary
puts "tomatoe".vegetables
#=> in <main>': undefined method 'vegetables' for "tomatoe":String
~~~
Wrongly reported as a bug [here](https://bugs.ruby-lang.org/issues/12514).
According to Shugo Maeda, this was expected behaviour. I argued that this is the way most monkey-patches work, and if Refinements can't cover the use case of inserting a custom DSL which references itself in the classes it refines, it can't fully replace monkey-patches, which I read was the main reason Refinements have been added to the language.
--
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>