MST

星途 面试题库

面试题:Ruby元编程DSL的复杂逻辑实现

使用Ruby元编程构建一个用于任务调度的DSL,要求支持任务的优先级设定、执行时间设定以及依赖关系设定。例如DSL语法可以是:task 'task1' do priority 2; run_at '2024 - 12 - 31 23:59:59'; depends_on 'task2' end 。请详细说明类结构设计、元编程技术运用以及关键代码实现。
40.9万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

类结构设计

  1. Task类:用于表示单个任务,包含任务名称、优先级、执行时间和依赖任务列表等属性。
  2. TaskScheduler类:作为调度器,管理所有任务,提供添加任务和执行任务的方法。

元编程技术运用

  1. define_method:用于动态定义DSL方法,如task方法。
  2. instance_eval:在task方法块内,通过instance_eval使块内代码在特定上下文(Task实例)中执行,从而可以调用priorityrun_atdepends_on等方法。

关键代码实现

class Task
  attr_accessor :name, :priority, :run_at, :depends_on

  def initialize(name)
    @name = name
  end
end

class TaskScheduler
  def initialize
    @tasks = []
  end

  def task(name, &block)
    task = Task.new(name)
    task.instance_eval(&block)
    @tasks << task
  end

  def run
    # 这里简单按照优先级排序,实际应用可能需要更复杂逻辑
    sorted_tasks = @tasks.sort_by { |t| t.priority }
    sorted_tasks.each do |task|
      # 这里简单模拟执行任务,实际应用需要按时间执行等逻辑
      puts "Running task #{task.name} with priority #{task.priority}, scheduled at #{task.run_at}, depends on #{task.depends_on}"
    end
  end
end

scheduler = TaskScheduler.new
scheduler.task 'task1' do
  priority 2
  run_at '2024 - 12 - 31 23:59:59'
  depends_on 'task2'
end
scheduler.run

上述代码中,Task类封装了任务的相关信息。TaskScheduler类通过task方法创建任务实例,并使用instance_eval执行任务块来设置任务属性。run方法简单演示了如何按照优先级执行任务,实际应用中需要考虑执行时间和依赖关系的处理逻辑。