面试题答案
一键面试假设配置文件格式如下,每行格式为:类名:方法名:方法实现逻辑
,以下是Ruby代码示例:
require 'yaml'
def load_classes_from_config(file_path)
classes = {}
begin
File.foreach(file_path) do |line|
class_name, method_name, method_logic = line.chomp.split(':')
unless classes.key?(class_name)
classes[class_name] = Class.new do
def self.name
@class_name
end
end
classes[class_name].class_variable_set(:@class_name, class_name)
end
begin
classes[class_name].define_method(method_name) do
instance_eval method_logic
end
rescue SyntaxError => e
puts "在定义 #{class_name} 的 #{method_name} 方法时发生语法错误: #{e.message}"
end
end
rescue Errno::ENOENT => e
puts "配置文件未找到: #{e.message}"
end
classes
end
# 使用示例
config_file = 'config.txt'
generated_classes = load_classes_from_config(config_file)
上述代码首先定义了一个load_classes_from_config
方法,该方法接受配置文件路径作为参数。它逐行读取配置文件,对于每一行,它提取类名、方法名和方法实现逻辑。
- 类的创建:如果类尚未创建,则使用
Class.new
动态创建一个新类,并通过类变量记录类名。 - 方法的定义:使用
define_method
为每个类动态添加方法,方法的实现逻辑通过instance_eval
执行配置文件中的字符串。在定义方法时捕获SyntaxError
,以处理方法实现逻辑中的语法错误。 - 文件读取错误处理:在读取配置文件时捕获
Errno::ENOENT
错误,以处理配置文件不存在的情况。
你可以将配置文件路径传递给load_classes_from_config
方法,该方法会返回一个包含所有动态生成类的哈希表。
请注意,配置文件中的方法实现逻辑字符串需要是有效的Ruby代码,并且由于instance_eval
的使用,要注意潜在的安全风险(如恶意代码注入)。在实际应用中,可能需要更严格的输入验证和安全措施。