MST

星途 面试题库

面试题:Ruby祖先链中的super关键字应用

在Ruby类继承体系中,有类A、B,B继承自A。A类有一个方法 `method_a`,B类重写了 `method_a` 方法。在B类的 `method_a` 方法中,如何正确使用 `super` 关键字调用A类的 `method_a` 方法?并且说明 `super` 与祖先链机制是怎样协同工作的?如果在B类的 `method_a` 中调用 `super` 但A类没有 `method_a` 方法,会发生什么?
25.2万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
  1. 在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之后的代码。

  1. super与祖先链机制协同工作原理

    • 祖先链(ancestors chain)是Ruby中类继承关系的一种线性表示。当一个类继承自另一个类时,Ruby会构建一个祖先链。例如,对于class B < AB.ancestors会返回[B, A, Object, Kernel, BasicObject]
    • 当在B类中调用super时,Ruby会在祖先链中查找下一个类(在这个例子中就是A类),并在该类中查找对应的方法。如果找到,就执行该方法。如果没找到,继续沿着祖先链向上查找,直到找到方法或者到达BasicObject类。如果在BasicObject类中也没找到,就会抛出NoMethodError异常。
  2. 在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