From: shugo@... Date: 2015-06-24T06:02:28+00:00 Subject: [ruby-core:69723] [Ruby trunk - Bug #11246] [Rejected] refine block doesn't respect "lexical" refinement information Issue #11246 has been updated by Shugo Maeda. Status changed from Open to Rejected Koichi Sasada wrote: > The following program making two refinements refine class C. > > ```ruby > class C > def foo > p C > end > end > > module R1 > refine C do > def foo > p R1 > super > end > end > end > > using R1 # 1 > > module R2 > using R1 # 2 > > refine C do > # using R1 # 3 > > def bar > C.new.foo > end > end > end > > using R2 > > C.new.bar > ``` > > Without `using R1 # 3`, `C#foo` was called in `R2::C#bar`. > > By `using R1 #1` and `#2`, we declared that this lexical scope should use R1. However, it seems that this declaration is ignored. > > Is it an intentional behavior? It's intentional. In refine blocks of a module X, all refinements defined in X are activated, and other refinements previously activated are deactivated. ---------------------------------------- Bug #11246: refine block doesn't respect "lexical" refinement information https://bugs.ruby-lang.org/issues/11246#change-53102 * Author: Koichi Sasada * Status: Rejected * Priority: Normal * Assignee: Shugo Maeda * ruby -v: ruby 2.3dev * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- The following program making two refinements refine class C. ```ruby class C def foo p C end end module R1 refine C do def foo p R1 super end end end using R1 # 1 module R2 using R1 # 2 refine C do # using R1 # 3 def bar C.new.foo end end end using R2 C.new.bar ``` Without `using R1 # 3`, `C#foo` was called in `R2::C#bar`. By `using R1 #1` and `#2`, we declared that this lexical scope should use R1. However, it seems that this declaration is ignored. Is it an intentional behavior? -- https://bugs.ruby-lang.org/