2011-10-16 92 views
0

在Ruby中必須有一種更有效的方法。我有一個方法列表,可以根據每個商店中的代碼以不同的方式在多個網站上劃分相同的東西(標題,價格)。例如:無效Ruby方法命名:作爲參數傳遞命名空間作爲調用方法的一種方式

def store1_get_title 
def store1_get_price 

def store2_get_title 
def store2_get_price 

def store3_get_title 
def store3_get_price 

當調用所有這些功能,我只是想有一個通用的電話說「命名空間」參數來完成調用任何的這些方法,而不必鍵入了所有的人,是這樣的:

for get_all_stores().each do |store| 
    store::get_title 
    store::get_price 
end 

...就像我想這將調用store1_get_title,store1_get_price,store2_get_title,store2_get_price。有沒有這樣的事情或更好的方式來做到這一點?

希望是有道理的。感謝您的任何意見!

編輯:這些任務在rake任務代碼中。

回答

5

這是類的完美用法。如果您發現兩家商店使用相同的軟件(可能是雅虎電子商務或EBay商店),則可以使用不同參數製作類的實例。

class Amazon 
    def get_price; end 
    def get_title; end 
end 

class Ebay 
    def initialize seller; end 
    def get_price; end 
    def get_title; end 
end 

[Amazon.new, Ebay.new("seller1"), Ebay.new("seller2")] each do |store| 
    store.get_price 
    store.get_title 
end 

您可以通過定義所有商店實現/繼承的基類或接口來以任何其他面向對象的語言執行此操作。

0

我不明白你的應用程序的邏輯。也許你應該考慮一個班級的定義(參見Ken Blooms的答案)。

不過你可以嘗試動態調用與send

def store1_get_title 
    p __method__ 
end 
def store1_get_price 
    p __method__ 
end 

def store2_get_title 
    p __method__ 
end 
def store2_get_price 
    p __method__ 
end 

def store3_get_title 
    p __method__ 
end 
def store3_get_price 
    p __method__ 
end 

all_stores = ['store1', 'store2', 'store3'] 
all_stores.each do |store| 
    send("#{store}_get_title") 
    send("#{store}_get_price") 
end 

你沒有定義什麼get_all_stores回報。在我的例子中,我使用了字符串。你可以添加一些語法糖和擴展字符串(我不提倡這種做法)

class String 
    def get_title() 
    send("#{self}_get_title") 
    end 
    def get_price() 
    send("#{self}_get_price") 
    end 
end 

all_stores.each do |store| 
    store.get_title 
    store.get_price 
end 

一個最後一句話。你寫了

for get_all_stores().each do |store| 

each就應該夠了。 for不是紅寶石般的,並且與each相結合,它對我來說不合理。