From: daniel@...42.com
Date: 2020-12-10T13:45:40+00:00
Subject: [ruby-core:101392] [Ruby master Feature#17380] Useful	`include/prepend` in `refine`

Issue #17380 has been updated by Dan0042 (Daniel DeLorme).


It would be nice if `prepend`/`include` worked within a `refine` block, but if they don't then at least it should raise an error. In that respect I disagree with closing #17374; even if the result is "expected", the fact that including a module is effectively a no-op should be considered a bug. Silently failing to have an effect is not so good.

----------------------------------------
Feature #17380: Useful `include/prepend` in `refine`
https://bugs.ruby-lang.org/issues/17380#change-89151

* Author: marcandre (Marc-Andre Lafortune)
* Status: Open
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
----------------------------------------
Currently, `prepend/include` within a `refine` block leads to a method not being to see itself, or others defined in the same module:

```ruby
module Code
  def recurse(value = nil)
    return value if value

    recurse(42) # => NoMethodError!!!
  end
end

module Extension
  refine Object do
    include Code
  end
end

using Extension
:x.recurse(:y) # => :y (ok)
:x.recurse     # => NoMethodError, was hoping for 42
```

I find this unintuitive and not useful.

The conclusion of the current situation from @shugo and others is ["I don't recommend module inclusion to define refined methods"](https://bugs.ruby-lang.org/issues/17374#note-9)

Could we change this situation so it can be recommended to use it?

What I believe would be more useful and is what I expected was that `include/prepend` within a `Module` would bring in the current methods in the Module, with the current refinements activated.

One use-case in particular is to publish libraries where one can give the option to the user to either:
- call `using GreatExtension` in each and every file that need it
- or `MyClass.prepend GreatExtension` once.

While [Jeremy Evans found a way to do it](https://bugs.ruby-lang.org/issues/17374#note-8), it remains challenging and unnatural.



-- 
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>