面试题答案
一键面试- 在B类的
method_a
方法中调用A类的method_a
方法: 在B类的method_a
方法中,直接使用super
关键字即可调用A类的method_a
方法。例如:
class A
def method_a
puts "This is method_a in class A"
end
end
class B < A
def method_a
super
puts "This is method_a in class B"
end
end
b = B.new
b.method_a
上述代码中,B类的method_a
方法先调用super
,这会执行A类的method_a
方法,然后再执行B类method_a
方法中super
之后的代码。
-
super
与祖先链机制协同工作原理:- 祖先链(ancestors chain)是Ruby中类继承关系的一种线性表示。当一个类继承自另一个类时,Ruby会构建一个祖先链。例如,对于
class B < A
,B.ancestors
会返回[B, A, Object, Kernel, BasicObject]
。 - 当在B类中调用
super
时,Ruby会在祖先链中查找下一个类(在这个例子中就是A类),并在该类中查找对应的方法。如果找到,就执行该方法。如果没找到,继续沿着祖先链向上查找,直到找到方法或者到达BasicObject
类。如果在BasicObject
类中也没找到,就会抛出NoMethodError
异常。
- 祖先链(ancestors chain)是Ruby中类继承关系的一种线性表示。当一个类继承自另一个类时,Ruby会构建一个祖先链。例如,对于
-
在B类的
method_a
中调用super
但A类没有method_a
方法的情况: 如果在B类的method_a
中调用super
,而A类没有method_a
方法,Ruby会沿着祖先链继续向上查找method_a
方法。如果在祖先链中的任何一个类中找到method_a
方法,就会执行该方法。如果一直到BasicObject
类都没有找到method_a
方法,就会抛出NoMethodError
异常。例如:
class A; end
class B < A
def method_a
super
end
end
b = B.new
b.method_a # 会抛出NoMethodError异常
上述代码中,B类调用super
,但A类没有method_a
方法,继续向上查找也找不到,最终抛出NoMethodError
。