面试题答案
一键面试类结构设计
- Task类:用于表示单个任务,包含任务名称、优先级、执行时间和依赖任务列表等属性。
- TaskScheduler类:作为调度器,管理所有任务,提供添加任务和执行任务的方法。
元编程技术运用
- define_method:用于动态定义DSL方法,如
task
方法。 - instance_eval:在
task
方法块内,通过instance_eval
使块内代码在特定上下文(Task实例)中执行,从而可以调用priority
、run_at
、depends_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
方法简单演示了如何按照优先级执行任务,实际应用中需要考虑执行时间和依赖关系的处理逻辑。