"super" 如何在细化中调用重写的方法?
How can "super" within a refinement call an overridden method?
我的印象是,改进超出了 Ruby 中通常的继承方案;在细化中覆盖方法替换了使用细化的所有代码的原始方法。
但是,我用 super
尝试了这个实验,似乎调用了被覆盖的方法:
class MyClass
def my_instance_method
puts "MyClass#my_instance_method"
end
end
module MyRefinement
refine(MyClass) do
def my_instance_method
puts "MyClass#my_instance_method in MyRefinement"
super
end
end
end
using MyRefinement
MyClass.new.my_instance_method
以上代码输出:
MyClass#my_instance_method in MyRefinement
MyClass#my_instance_method
我的问题是,如何?细化是否以某种方式插入到 class 层次结构中?
基于 documentation,细化的内置行为的方法查找与您观察到的相同。
您的假设是正确的,它不是典型的继承,可以通过调用 superclass
看出
class C
def foo
puts "C#foo"
end
end
module M
refine C do
def foo
puts "C#foo in M"
puts "class: #{self.class}"
puts "superclass: #{self.class.superclass}"
super
end
end
end
using M
x = C.new
x.foo
输出:
C#foo in M
class: C
superclass: Object
C#foo
我的印象是,改进超出了 Ruby 中通常的继承方案;在细化中覆盖方法替换了使用细化的所有代码的原始方法。
但是,我用 super
尝试了这个实验,似乎调用了被覆盖的方法:
class MyClass
def my_instance_method
puts "MyClass#my_instance_method"
end
end
module MyRefinement
refine(MyClass) do
def my_instance_method
puts "MyClass#my_instance_method in MyRefinement"
super
end
end
end
using MyRefinement
MyClass.new.my_instance_method
以上代码输出:
MyClass#my_instance_method in MyRefinement
MyClass#my_instance_method
我的问题是,如何?细化是否以某种方式插入到 class 层次结构中?
基于 documentation,细化的内置行为的方法查找与您观察到的相同。
您的假设是正确的,它不是典型的继承,可以通过调用 superclass
class C
def foo
puts "C#foo"
end
end
module M
refine C do
def foo
puts "C#foo in M"
puts "class: #{self.class}"
puts "superclass: #{self.class.superclass}"
super
end
end
end
using M
x = C.new
x.foo
输出:
C#foo in M
class: C
superclass: Object
C#foo