2011-11-08 166 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? –

相關問題