面试题答案
一键面试模块和类的区别
- 实例化
- 类:可以实例化,即通过
new
方法创建对象。例如:
- 类:可以实例化,即通过
class Dog
def bark
puts "Woof!"
end
end
dog = Dog.new
dog.bark
- **模块**:不能实例化,它只是方法和常量的集合,用于组织代码和实现混入。
2. 继承 - 类:可以继承另一个类,形成类层次结构,子类可以继承父类的方法和属性。例如:
class Animal
def speak
puts "I am an animal"
end
end
class Cat < Animal
def meow
puts "Meow!"
end
end
cat = Cat.new
cat.speak
cat.meow
- **模块**:不能继承类,也不能被类继承,但可以被类混入。
3. 用途 - 类:主要用于创建具有状态(实例变量)和行为(方法)的对象。 - 模块:用于封装相关的方法和常量,避免命名冲突,以及实现混入功能,为多个类提供共享的功能。
使用模块实现混入功能示例
# 定义包含日志记录方法的模块
module Logging
def log(message)
puts "#{Time.now}: #{message}"
end
end
# 定义一个类并混入Logging模块
class Calculator
include Logging
def add(a, b)
log("Adding #{a} and #{b}")
a + b
end
def subtract(a, b)
log("Subtracting #{b} from #{a}")
a - b
end
end
# 创建Calculator类的实例
calc = Calculator.new
result = calc.add(3, 5)
puts "Result: #{result}"
result = calc.subtract(10, 4)
puts "Result: #{result}"
在上述代码中,Logging
模块定义了log
方法用于记录日志。Calculator
类通过include Logging
将Logging
模块混入,使得Calculator
类的实例方法add
和subtract
能够调用log
方法记录日志。