【发布时间】:2017-09-22 05:31:13
【问题描述】:
我有以下代码来表示 Ruby 中的不同值对象。不同类之间唯一变化的是 INITIALIZATION_ATTRIBUTES 数组,它表示值对象的属性列表。我找不到干燥此代码的方法。我尝试使用模块并访问包含的类的常量,但遇到了here 描述的奇怪的常量查找行为。本质上,模块代码被多次评估,它解释最后评估的类的常量并将其值应用于所有值对象类。
还有更好的选择吗?我也尝试了一个基类,但我无法让它工作。
module Values
class MaintenanceRegimeSerializer
INITIALIZATION_ATTRIBUTES = [:distance_between_services, :months_between_services]
def self.load(json)
json ||= '{}'
hash = JSON.parse json, symbolize_names: true
self.new(*INITIALIZATION_ATTRIBUTES.map {|key| hash[key]})
end
def self.dump(obj)
unless obj.is_a?(self)
raise ::ActiveRecord::SerializationTypeMismatch,
"Attribute was supposed to be a #{self}, but was a #{obj.class}. -- #{obj.inspect}"
end
obj.to_json
end
attr_reader *INITIALIZATION_ATTRIBUTES
define_method :initialize do |*args|
raise ArgumentError unless INITIALIZATION_ATTRIBUTES.length == args.length
INITIALIZATION_ATTRIBUTES.each_with_index do |attribute, index|
instance_variable_set "@#{attribute}", args[index]
end
end
end
end
【问题讨论】:
-
你是说你有几个类,除了初始化属性之外,它们都是一样的?
-
你说你想让这段代码更干——暗示你在某个地方重复自己。那会在哪里?这对我来说看起来很“元”。
标签: ruby-on-rails ruby metaprogramming constants