Issue #17336 has been updated by Eregon (Benoit Daloze).
How about:
```ruby
class Foo
using do
refine Array do
def flat_map!(&block)
replace(flat_map(&block))
end
end
refine String do
...
end
end
```
So let `using` take a block instead of a positional argument.
That way, it's also possible to refine multiple classes/modules at once, which is often better than multiple `using` calls (notably, such methods can use the refinements of each other and it's more concise)
----------------------------------------
Feature #17336: using refined: do ... end
https://bugs.ruby-lang.org/issues/17336#change-88638
* Author: k0kubun (Takashi Kokubun)
* Status: Open
* Priority: Normal
----------------------------------------
## Problem
When we need a monkey patch which is used only in a single file, we'd like to define a refinement and use it in the same place. The problem is that it needs deep indentation and `Module.new { ... }` which feels redundant.
```rb
class Foo
using Module.new {
refine Array do
def flat_map!(&block)
replace(flat_map(&block))
end
end
}
# ...
end
```
@tagomoris proposed an idea to reduce indentation and remove `Module.new { ... }`. This looks pretty convenient, but I want to write `do ... end`, which would make it a block of `using` here, because we almost always use `... end` for defining methods or modules.
```rb
module Kernel
def refined(mod, &block)
Module.new do
refine(mod, &block)
end
end
end
class Foo
using refined(Array) {
def flat_map!(&block)
replace(flat_map(&block))
end
}
# ...
end
```
## Proposal
How about supporting this? Because `using` currently doesn't take a block, it doesn't conflict with the existing syntax.
```rb
class Foo
using refined: Array do
def flat_map!(&block)
replace(flat_map(&block))
end
end
# ...
end
```
This syntax is based on ideas of @tagomoris and @znz .
--
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>