MST
星途 面试题库

面试题:Ruby元数据编程与复杂属性追踪

假设你正在开发一个复杂的Ruby应用,其中有一个类,类中有多个属性。要求使用元数据编程实现属性的细粒度追踪,包括属性何时被首次读取、最后一次修改时间,以及修改的用户标识(假设可以通过一个方法获取当前用户标识)。请详细说明实现思路并给出关键代码片段。
29.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义类及属性:首先定义包含多个属性的类。
  2. 使用元数据存储追踪信息:通过为每个属性创建对应的元数据存储结构,用于记录首次读取时间、最后修改时间和修改用户标识。
  3. 属性访问方法重写:重写属性的读取和写入方法,在读取时记录首次读取时间,在写入时更新最后修改时间和修改用户标识。

关键代码片段

class MyComplexClass
  # 假设获取当前用户标识的方法
  def current_user_id
    # 实际实现获取当前用户标识逻辑
    "user123"
  end

  def initialize
    @meta_data = {}
  end

  def define_tracked_attribute(attr_name)
    # 定义属性的读取方法
    define_method(attr_name) do
      if @meta_data[attr_name].nil? || @meta_data[attr_name][:first_read].nil?
        @meta_data[attr_name] ||= {}
        @meta_data[attr_name][:first_read] = Time.now
      end
      instance_variable_get("@#{attr_name}")
    end

    # 定义属性的写入方法
    define_method("#{attr_name}=") do |value|
      @meta_data[attr_name] ||= {}
      @meta_data[attr_name][:last_modified] = Time.now
      @meta_data[attr_name][:modified_by] = current_user_id
      instance_variable_set("@#{attr_name}", value)
    end
  end
end

# 使用示例
my_obj = MyComplexClass.new
my_obj.define_tracked_attribute(:example_attr)
my_obj.example_attr = "initial value"
puts my_obj.example_attr
puts my_obj.instance_variable_get(:@meta_data)