2011-10-16 179 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相结合,它对我来说不合理。