From: shugo@... Date: 2015-05-29T02:06:47+00:00 Subject: [ruby-core:69409] [Ruby trunk - Bug #11182] Refinement with alias causes strange behavior Issue #11182 has been updated by Shugo Maeda. Koichi Sasada wrote: > Wait. `each` is not good terminology for our project. Use `iterate` intead. > > ```ruby > module OrderedHashEach > refine Hash do > def each > sort.each{|k, v| > yield k, v > } > end > end > end > > class MyHash < Hash > def initialize *args > args.each{|(k, v)|self[k] = v} > end > > alias iterate each > end > > h = MyHash.new([:b, 1], [:a, 2]) > > using OrderedHashEach > h.iterate{|k, v| p [k, v]} # [:b, 1] [:a, 2] > ``` > > It doesn't affect :( It is unexpected result for me. If you need to refine iterate you should define OrderedHashIterate and use it instead. Refinements are designed not to change behavior implicitly. If refinements are changed to affect aliases, someone might complain that refinements don't support local rebinding. ---------------------------------------- Bug #11182: Refinement with alias causes strange behavior https://bugs.ruby-lang.org/issues/11182#change-52680 * Author: Koichi Sasada * Status: Feedback * 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 `
': undefined method `bar' for # (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) 4.PNG (38.5 KB) 3.PNG (37.9 KB) alias_affected_by_original_refinement.diff (1.34 KB) 6.PNG (36.6 KB) 7.PNG (40.7 KB) -- https://bugs.ruby-lang.org/