Bug #16977
closedAmbiguous lookup super for refinements
Description
In specification we have the note
Note that super in a method of a refinement invokes the method in the refined class even if there is another refinement which has been activated in the same context.
If we take a look at the example:
module A
def foo
"foo from A"
end
end
class C
def foo
"foo from C"
end
end
refinement =
Module.new do
refine C do
include A
end
end
refinement2 =
Module.new do
refine C do
def foo
super
end
end
end
using refinement
using refinement2
puts C.new.foo
# => "foo from C"
This works as described in the specification.
However, if we replace refinement2
in the example with
# the same A, C and refinement definitions here
module B
def foo
super
end
end
refinement2 =
Module.new do
refine C do
include B
end
end
using refinement
using refinement2
puts C.new.foo
# => "foo from A"
I don’t understand why include
works differently than refining a method directly.
From my point of view, we should get foo from C
in both cases.
Updated by shugo (Shugo Maeda) over 4 years ago
ssnickolay (Nikolay Sverchkov) wrote:
In specification we have the note
Note that super in a method of a refinement invokes the method in the refined class even if there is another refinement which has been activated in the same context.
If we take a look at the example:
(snip)
I don’t understand whyinclude
works differently than refining a method directly.
From my point of view, we should getfoo from C
in both cases.
In the former case, super is called in the scope where a refinement is defined, and thus it invokes the method in the refined class.
However, in the latter case, super is called outside the scope where a refinement is defined, and it looks up the ancestor chain.
The behavior of include in refine blocks is confusing, so it may be prohibited in the future.
Updated by Eregon (Benoit Daloze) over 4 years ago
- Related to Bug #17007: SystemStackError when using super inside Module included and lexically inside refinement added
Updated by jeremyevans (Jeremy Evans) over 4 years ago
- Status changed from Open to Closed
Applied in changeset git|021cec938af55a7ef368eadc99a6e3ff2252510e.
Clarify behavior of super in method in module included in refinement [ci skip]
Fixes [Bug #16977]