Issue #11182 has been updated by Shugo Maeda.


Koichi Sasada wrote:
> I believe the implementation uses (2) model.
> 
> For (1), calling M::C#bar is reasonable.
> For (2), calling M::C#bar is reasonable.
> 
> Wow, both should be M::C#bar.
> 
> Example on #5, both models should call M::C#bar. But my comment at #5 "C#bar should be same as C#foo" is wrong.

M::C#bar is not defined in Example #5, so the orignal C#bar, which is an alias of C#foo, should be called, shoudn't it?


----------------------------------------
Bug #11182: Refinement with alias causes strange behavior
https://bugs.ruby-lang.org/issues/11182#change-52652

* Author: Koichi Sasada
* Status: Open
* Priority: Normal
* Assignee: Shugo Maeda
* ruby -v: 2.3dev
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
The following script causes strange behavior.

```ruby
class C
  def foo
    p "C"
  end
end

module M
  refine C do
    def foo
      p "Refiend C"
    end
  end
end

class D < C
  alias bar foo
end

using M
D.new.bar
#=> t.rb:21:in `<main>': undefined method `bar' for #<D:0x29fbf58> (NoMethodError)
```

It seems strange.

Maybe (1) C#foo or (2) M#C#foo should be called. But I'm not sure which is suitable.

Previous versions:

```
ruby 2.0.0p606 (2014-11-28 revision 48636) [i386-mswin32_110]
t.rb:9: warning: Refinements are experimental, and the behavior may change in future versions of Ruby!
"C"

ruby 2.1.5p312 (2015-03-10 revision 49912) [i386-mswin32_110]
"C"
```


---Files--------------------------------
1.PNG (38.7 KB)
2.PNG (43.7 KB)


-- 
https://bugs.ruby-lang.org/