0

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

4

2 回答 2

5

这是类的完美用途。如果您发现两家商店使用相同的软件为它们提供支持(可能是 Yahoo Commerce 或 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

您可以通过定义所有商店实现/继承的基类或接口,在任何其他面向对象的语言中做到这一点。

于 2011-10-16T17:49:20.530 回答
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 它结合起来对我来说看起来不合理。

于 2011-10-16T18:33:15.923 回答