Issue #17336 has been updated by k0kubun (Takashi Kokubun).

Status changed from Open to Closed

> Why not #16241?

Works for me :) Honestly `whatever Array do ... end` sounds fine. When I tried to implement a quick version, I picked `using Array do .. end`, and it was changed to this proposal because some others said it should be keeping the word "refine". I also thought, "well, it's also using in place", but it's not a big deal. If `refining` is there, I'd be happy to use it. I'm closing this as a duplicate.

> How about:
> So let using take a block instead of a positional argument.

It might be helpful anyway, but a part of the ticket's motivation was to eliminate the deep indentation.

----------------------------------------
Feature #17336: using refined: do ... end
https://bugs.ruby-lang.org/issues/17336#change-88648

* Author: k0kubun (Takashi Kokubun)
* Status: Closed
* 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>