2011-11-08 117 views
1

如果我从一个内置包装器的数据库中抓取一个字段,我会以对象数组的形式接收数据,每个对象都有一系列可以调用的实例。因此,例如:在实例中覆盖方法的最佳方式是什么?

class DataWrapper 
    attr_reader :foo, :bar 
end 

并且数据被返回,例如[@ DATA1,DATA2 @,@ DATA3等],其中@data [1-3]是DataWrapper的所有实例。

那么,在我知道将要使用的上下文以及我想如何格式化之前,如果我收到该数据会怎么样。什么是最好的(非Rails)的方式来格式化给出具体语境中的数据,如

case :xml 
    @data1.to_xml.foo #foo = 4 
case :web_table 
    @data1.to_web_table.foo #foo = "four" 

回答

1

这听起来像你的BaseClass的对象的数组,并希望以后发生变异的情况下,会有一些BaseClass的子类。你不可以做这个。你可以做的是为每个“子类”表示创建模块,并根据需要将它们混合到实例中。

如果你有对象的数组,你要修改的情况下,特定的模块中混合:

array.each{ |o| o.extend(MyModule) } 

例如:

Nib = Struct.new :val do 
    def to_s 
    value # Must be implemented by instance/subclass 
    end 
end 

module Nib::Precise 
    def value; "%.1f" % val; end 
end 

module Nib::Rough 
    def value; val.round.to_s; end 
end 

module Nib::Ballpark 
    def value; ((val/10).round * 10).to_s; end 
end 

nibs = [ Nib.new(33.7), Nib.new(29.1) ] 

nibs.each{ |n| n.extend(Nib::Precise) } 
p nibs.join(", ") #=> "33.7, 29.1" 

nibs.each{ |n| n.extend(Nib::Rough) } 
p nibs.join(", ") #=> "34, 29" 

nibs.each{ |n| n.extend(Nib::Ballpark) } 
p nibs.join(", ") #=> "30, 30" 
+1

我已根据您对@LarryK的评论编辑了我的答案;这是你需要的吗? – Phrogz

+0

令人惊叹,这是完美的...谢谢! –

0

的“格式化”的方法或许应该是持续。例如

case :xml 
    @data1.foo.to_xml #foo = 4 
case :web_table 
    @data1.foo.to_web_table #foo = "four" 
.... 

您需要将格式化方法混合到基类或Object中。

格式化方法可以检查父类的类并决定如何转换该值。

+0

这是我正在寻找的内容,但是如何动态地包含mixin? –

相关问题