在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
当调用所有这些函数时,我只想通过一个名为“namespace”参数的泛型调用来调用这些方法,而不必输入所有这些,如:
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任务代码中。
答案 0 :(得分: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
您可以通过定义所有商店实现/继承的基类或接口,在任何其他面向对象语言中执行此操作。
答案 1 :(得分: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
返回的内容。在我的例子中,我使用了Strings。你可以添加一些语法糖并扩展String(我不推荐这个)
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|
仅仅{p> each
就足够了。 for
不像红宝石一样,与each
结合使用对我来说看起来不合理。