I'm studying for ruby gold acquisition. My understanding of super changed and I wanted to share it.
First of all, what kind of result will be output when the following code is executed?
module M
def foo
super
puts "M#foo"
end
end
class C2
def foo
puts "C2#foo"
end
end
class C < C2
def foo
super
puts "C#foo"
end
include M
end
C.new.foo
Option 1
C2#foo C#foo
Option 2
C2#foo M#foo C#foo
Option 3
Error is displayed
I always thought it was 1.
By the way, the correct answer is option 2
If you understand it properly and answer it correctly, you don't have to look anymore.
Thank you for watching so far.
First, how did I choose option 1
"C class foo method, hmm hmm" "Oh, super? You just have to look at the parent class foo." "I see, the answer is 1!"
It is like this. I thought it wouldn't be called when I included the module.
Let's learn about the super class. First of all, briefly about super described in Reference Manual
super calls the method that the current method is overriding
I see, it doesn't seem to call a superclass method. Now let's use the ancestors method.
##abridgement
class C < C2
def foo
super
puts "C#foo"
end
include M
self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end
C.new.foo
ancestors is a method that shows the search order of methods in a simple way. For example, when the foo method is executed, it looks for the C foo method, and if not, it searches for M foo ....
Now let's look at the code in question again.
module M
def foo
super #Reference foo in C2
puts "M#foo"
end
end
class C2
def foo
puts "C2#foo"
end
end
class C < C2
def foo
super #Refer to M's foo
puts "C#foo"
end
include M
self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end
C.new.foo
#=> C2#foo
#=> M#foo
#=> C#foo
--If there is a description of super, the next method will be searched. --Does not search for methods of the parent class
If you are studying for qualifications, you will deepen your understanding, so if you have little practical experience, you may try studying.
Recommended Posts