0

次のコードで、多くのメソッドParserを持つクラスを作成します。parse_something最後に、それらはparseメソッドでマージされます。

class Parser
  def parse(html)
    @data = Nokogiri.HTML(open(html))
    merged_hashes = {}

    array_of_hashes = [
      parse_department,
      parse_super_saver,
      parse_new_arrivals,
      parse_out_of_stock,
      parse_categories,
      parse_results
    ]
    array_of_hashes.inject(merged_hashes,:update)

    return merged_hashes
  end

  def parse_department  
    department = @data.css('#ref_2619534011')

    @department_hash = {}
    department.css('li').drop(1).each do | department |
      department_title = department.css('.refinementLink').text
      department_count = department.css('.narrowValue').text[/[\d,]+/].delete(",").to_i
      @department_hash[:department] ||= {}
      @department_hash[:department]["Pet Supplies"] ||= {}
      @department_hash[:department]["Pet Supplies"][department_title] = department_count
    end 

    return @department_hash
  end 

  def parse_super_saver  

(等...)

だから今、私はそれを次のように使用しています:

def html_pet_supplies
  File.open("amazon_pet_supplies.html")
end

Parser.new.parse html_pet_supplies

しかし、代わりに次のように使用したいと思います。Parser.parse html_pet_supplies

削除しようとしnewましたが、次のエラーが発生しました。

NoMethodError: Parser:Class の未定義のメソッド `parse'

私がするようにコードを変更する最も簡単な方法は何Parser.parseですか?

4

2 に答える 2

1

Parserすべてのメソッドをクラス メソッドに書き直す代わりに、インスタンスを作成してParser#parseから呼び出すことができますParser.parse

class Parser
  def self.parse(html)
    self.class.new.parse(html)
  end

  def parse(html)
    @data = Nokogiri.HTML(open(html))
    # ...
  end
  #...
end

現在Parser.parse(html)は と同等Parser.new.parse(html)です。

于 2013-08-21T07:20:24.447 に答える
1

静的メソッド宣言を使用する

class Parser
  def self.parse(html)
    #Parsing logic
  end
end

その後、次の方法で呼び出すことができますParser.parse filename

更新解析ロジックでインスタンス変数が宣言されて@dataいるため、現在のロジックで動作させることはできません。parse_department を呼び出せるようにするには、インスタンスを作成する必要があります。

**さらなる更新**

簡単な答えあなたの現在のロジックは問題ありません。

長い答えそれはOOPに関するものです。Parser#parse メソッドには、@dataインスタンス変数の宣言があります。@dataクラスではなくオブジェクトに対してのみ存在できます。つまり、静的メソッドではなくインスタンスメソッドでのみ使用できます。それを呼び出しParser.newてオブジェクトを作成すると、それ@dataが存在できるようになります。静的メソッドは、オブジェクトを作成せずにクラスで直接呼び出すことができます。続きを読むRuby クラスとインスタンス メソッドを理解する

于 2013-08-21T06:42:58.360 に答える