MST

星途 面试题库

面试题:Ruby 动态定义方法与作用域及继承的关系

假设我们有一个类 `ParentClass`,在 `ParentClass` 中动态定义一个方法 `dynamic_method`,然后创建一个子类 `ChildClass < ParentClass`。请问在 `ChildClass` 的实例上能否调用 `dynamic_method`?如果能,是如何实现继承的?如果不能,如何修改代码使其能调用?同时说明 Ruby 中动态定义方法在这种继承关系下作用域的特点。
34.1万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
  1. 能否调用
    • 在Ruby中,在ParentClass中动态定义的方法dynamic_methodChildClass的实例可以调用。
  2. 如何实现继承
    • Ruby中类的继承机制会将父类的所有方法(包括动态定义的方法)继承给子类。当在ParentClass中动态定义dynamic_method时,Ruby的方法查找路径(self.class.ancestors)会将父类的方法包含进来,子类实例在查找方法时,会沿着这个路径找到父类中定义的dynamic_method。例如:
class ParentClass
  define_method :dynamic_method do
    puts "This is a dynamic method in ParentClass"
  end
end

class ChildClass < ParentClass
end

child = ChildClass.new
child.dynamic_method
  1. Ruby中动态定义方法在这种继承关系下作用域的特点
    • 继承性:动态定义在父类中的方法和普通定义的方法一样,会被子类继承。这意味着子类可以直接调用父类动态定义的方法,就像调用普通方法一样。
    • 作用域链:方法查找遵循Ruby的标准作用域链规则。当在子类实例上调用方法时,Ruby首先在子类本身查找方法,如果找不到,就沿着继承链(ancestors数组)向上在父类中查找,包括动态定义的方法。这保证了动态定义的方法在继承体系中的可访问性和一致性。