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

これは、クラスでの使用に最適です。同じソフトウェアを使用している 2 つのストア (おそらく Yahoo コマースまたは 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返すかを定義していません。私の例では、文字列を使用しました。構文糖衣を追加して 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|

eachだけで十分なはずです。forルビーのようではなく、それと組み合わせると、each 私には合理的に見えません。

于 2011-10-16T18:33:15.923 に答える