MST

星途 面试题库

面试题:Ruby动态生成类的复杂应用

假设有一个配置文件,其中定义了一系列类名及其对应的方法名和方法实现逻辑(以字符串形式存储)。请编写Ruby代码,根据这个配置文件动态生成所有类,并为每个类添加对应的方法,方法实现需要符合配置文件中的逻辑。同时要考虑如何进行错误处理,确保代码的健壮性。
13.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

假设配置文件格式如下,每行格式为:类名:方法名:方法实现逻辑,以下是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方法,该方法接受配置文件路径作为参数。它逐行读取配置文件,对于每一行,它提取类名、方法名和方法实现逻辑。

  1. 类的创建:如果类尚未创建,则使用Class.new动态创建一个新类,并通过类变量记录类名。
  2. 方法的定义:使用define_method为每个类动态添加方法,方法的实现逻辑通过instance_eval执行配置文件中的字符串。在定义方法时捕获SyntaxError,以处理方法实现逻辑中的语法错误。
  3. 文件读取错误处理:在读取配置文件时捕获Errno::ENOENT错误,以处理配置文件不存在的情况。

你可以将配置文件路径传递给load_classes_from_config方法,该方法会返回一个包含所有动态生成类的哈希表。

请注意,配置文件中的方法实现逻辑字符串需要是有效的Ruby代码,并且由于instance_eval的使用,要注意潜在的安全风险(如恶意代码注入)。在实际应用中,可能需要更严格的输入验证和安全措施。