0

以下の Ruby スクリプトを実行すると、次のエラーが表示されます。

s3parse.rb:12:in `block in <class:AccountLog>': undefined method `extract_account_id' for AccountLog:Class (NoMethodError)

クラスメソッドであるべきだとは思いませんが、私のメソッドを考慮していない理由はありますか?

class AccountLog
attr_accessor :bytes, :account_id, :date

    def extract_account_id(line)
            line.match(%r{accounts/(\d+)}).captures.join.to_i
    end

    s3log = File.open('vidcoder.txt').each do |line|
        account_log = AccountLog.new
        account_log.date = line.match(%r{\[[^:]*}).to_s.delete"[" #need to finish this regex to make it work
        account_log.account_id = extract_account_id(line)
        account_log.bytes = line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures.join.to_i
        puts "\n" 
        puts "The api request on #{account_log.date} was fromm account number #{account_log.account_id} and the bytes were #{account_log.bytes}"
    end

end
4

3 に答える 3

3

def extract_account_idインスタンスメソッドを定義します。

あなたがそれを呼び出す方法では、代わりにクラスメソッドが必要です。

次のように定義します。

def self.extract_account_id(line)

または、すでにAccountLogインスタンスがあるので、それを使用して呼び出しますextract_account_id:

account_log.account_id = account_log.extract_account_id(line)

2 番目の方法では、メソッド定義を変更する必要はなく、インスタンスextract_account_idを介して呼び出すだけであることに注意してください。account_log

s3log = File...そして、クラス定義の外に置きたいと思うでしょう。

または、代わりに定数を使用します。S3log = ...

その後、次のようにアクセスできますAccountLog::S3log

于 2012-12-01T17:23:59.543 に答える
0

クラスメソッドであってはならないと思う理由はありますか? クラスメソッドのコンテキストで使用しているため、クラスAccountLogにはそのようなメソッドがないと言っています。

メソッドに名前を付ければ、うまくself.extract_account_id(line)いくと確信しています。

あなたがやろうとしていることから、これはあなたが探しているものだと思いますか?

class AccountLog
  attr_accessor :bytes, :account_id, :date

  def self.extract_account_id(line)
    line.match(%r{accounts/(\d+)}).captures.join.to_i
  end
end

s3log = File.open('vidcoder.txt').each do |line|
  account_log = AccountLog.new
  account_log.date = line.match(%r{\[[^:]*}).to_s.delete"[" #need to finish this regex to make it work
  account_log.account_id = extract_account_id(line)
  account_log.bytes = line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures.join.to_i
  puts "\n" 
  puts "The api request on #{account_log.date} was fromm account number #{account_log.account_id} and the bytes were #{account_log.bytes}"
end
于 2012-12-01T17:24:08.857 に答える
0

クラス メソッドのアプローチを採用することもできますが、さらに多くのことが行われているようです。

抽出ロジックは、クラスにたむろするのではなく、メソッド自体に配置する必要があります。次に、クラスの外に、ログとアカウント ID の抽出用のメソッドを呼び出すことができる AccountLog のインスタンスを用意します。その時点で、それらの値で何かを行うことができます。

クラスメソッドかどうかは、クラスがもう少しきれいになった後に検討できる詳細です。

于 2012-12-01T17:34:09.687 に答える