MST
星途 面试题库

面试题:Ruby面向对象编程之模块应用

在Ruby中,模块(Module)常用于封装方法和常量,避免命名冲突以及实现混入(Mixin)功能。请阐述模块和类的区别,并举例说明如何使用模块实现混入功能,例如定义一个包含日志记录方法的模块,并将其混入到一个类中,实现该类实例方法调用时能记录日志。
14.0万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

模块和类的区别

  1. 实例化
    • :可以实例化,即通过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 LoggingLogging模块混入,使得Calculator类的实例方法addsubtract能够调用log方法记录日志。