我有几个类,每个类都定义了各种统计数据。
class MonthlyStat
attr_accessor :cost, :size_in_meters
end
class DailyStat
attr_accessor :cost, :weight
end
我想为这些对象的集合创建一个装饰器/演示者,这让我可以轻松访问有关每个集合的聚合信息,例如:
class YearDecorator
attr_accessor :objs
def self.[]= *objs
new objs
end
def initialize objs
self.objs = objs
define_helpers
end
def define_helpers
if o=objs.first # assume all objects are the same
o.instance_methods.each do |method_name|
# sums :cost, :size_in_meters, :weight etc
define_method "yearly_#{method_name}_sum" do
objs.inject(0){|o,sum| sum += o.send(method_name)}
end
end
end
end
end
YearDecorator[mstat1, mstat2].yearly_cost_sum
不幸的是,实例方法中没有定义方法。
将其替换为:
class << self
define_method "yearly_#{method_name}_sum" do
objs.inject(0){|o,sum| sum += o.send(method_name)}
end
end
...也失败了,因为实例中定义的变量 method_name 和 objs 不再可用。在红宝石中是否有一个惯用的方法来完成这个?