2014-01-23 53 views
0

我有一個類調用不同的供應商來查找是否有可用的項目。我如何執行每個常量返回的類?Ruby - 從包含類名稱的CONSTANT調用一個類

class ItemProvider 

    ADAPTER_ONE = Providers::ItemFromSupplierOne 
    ADAPTER_TWO = Providers::ItemFromSupplierTwo 

    def get_item(item) 
    id = ItemDetail.new(item) 
    %w(ADAPTER_ONE ADAPTER_TWO).each do |provider| 
     item_detail = provider.new(id) 
     break if item_detail.valid? 
    end 
    item_detail 
end 
+0

就像你在做。你不只是引用類名,它就是類本身。 –

+0

@DaveNewton - 我如何引用類名。當我打印提供商的價值時,它只是說ADAPTER_XXX。 –

+0

您正在創建一個字符串數組。把它們放在一個數組中。 –

回答

2

你的問題是你沒有製作一個包含常量值的數組;你正在用字符串「ADAPTER_ONE」和「ADAPTER_TWO」創建一個數組。 %w()語法總是生成一個字符串數組 - 它不能解析變量名。

你需要的是改變你的get_item代碼是這樣的:

def get_item(item) 
    id = ItemDetail.new(item) 
    [ADAPTER_ONE, ADAPTER_TWO].each do |provider| 
    item_detail = provider.new(id) 
    break item_detail if item_detail.valid? 
    end or nil # break automatically makes the block return the value you break with 
end 

順便說一句,我個人覺得,我把它改寫這樣的:

def get_item(item) 
    id = ItemDetail.new(item) 
    [ADAPTER_ONE, ADAPTER_TWO].map {|provider| provider.new(id) }.find &:valid? 
end 
+0

啊,我現在看到它。謝謝@Chuck。我也喜歡你如何編寫重構我的代碼。我可以問什麼 - .find&:有效?在這裏做? –

+0

@learning_to_swim:'&'運算符向符號':valid?'發送'to_proc'。 Symbol類將'to_proc'實現爲'proc {| obj,* args | obj.send(self,* args)}'。所以它相當於'find {| provider | provider.valid?}',它返回第一個回答「有效?」的提供者。 – Chuck

+0

謝謝,這很有幫助。 –