面试题答案
一键面试1. 类继承体系
类继承
在Ruby中,类继承通过 <
符号实现。子类继承父类的属性和方法,实现代码复用。例如:
class Animal
def speak
puts "I am an animal"
end
end
class Dog < Animal
def bark
puts "Woof!"
end
end
这里 Dog
类继承自 Animal
类,Dog
实例可以调用 speak
方法。继承使得对象模型形成层级结构,子类可以扩展或重写父类方法。
模块混入
模块(Module)是一组方法和常量的集合。通过 include
关键字混入到类中,为类添加功能。例如:
module Flyable
def fly
puts "I can fly"
end
end
class Bird < Animal
include Flyable
end
Bird
类混入 Flyable
模块后,Bird
实例就具有了 fly
方法。模块混入打破了单继承的限制,使类可以拥有多个来源的功能,丰富了对象模型。
2. 对象的内存布局
在Ruby中,对象是类的实例。每个对象都有一个指向其所属类的指针。类对象包含方法表,方法表存储了类定义的方法及其实现。对象在内存中主要包含实例变量(如果有)和指向类的引用。例如:
class Person
def initialize(name)
@name = name
end
end
p = Person.new("John")
p
对象在内存中有一个指向 Person
类的引用,并且包含实例变量 @name
。
3. 方法查找路径
在复杂继承和混入情况下,Ruby的方法查找路径遵循特定规则。以类继承和模块混入为例:
module M1
def m1_method
puts "M1 method"
end
end
module M2
def m2_method
puts "M2 method"
end
end
class Parent
def parent_method
puts "Parent method"
end
end
class Child < Parent
include M1
include M2
def child_method
puts "Child method"
end
end
当调用 Child
实例的方法时,查找顺序为:Child
类自身定义的方法(如 child_method
),然后按照混入模块的顺序(M2
、M1
)查找模块中的方法,最后查找父类(Parent
)的方法。
4. 优化方法查找过程以提高性能
- 使用类方法而非实例方法:如果方法不需要访问实例变量,定义为类方法。因为类方法的查找路径更直接,不需要通过实例对象查找。
class MathUtils
def self.add(a, b)
a + b
end
end
- 减少继承和混入层级:层级过深会增加方法查找时间。尽量保持类继承和模块混入结构简洁。
- 使用
singleton_class
:为特定对象定义单例方法,避免在整个类层次结构中查找。
obj = Object.new
def obj.special_method
puts "Special method for this object"
end
这样 special_method
仅在 obj
的单例类中查找,提高查找效率。