效率低下的Ruby方法命名:将名称空间作为参数传递,作为调用方法的方法

时间:2011-10-16 17:43:21

标签: ruby methods namespaces arguments rake-task

在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任务代码中。

2 个答案:

答案 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结合使用对我来说看起来不合理。