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)

请注意,第二种方式不需要更改方法定义,只需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

虽然您可以采用类方法方法,但似乎还有更多工作要做。

您应该将提取逻辑本身放在一个方法中,而不是让它在您的类中闲逛。然后在类之外,有一个 AccountLog 实例,您可以在其中调用用于提取日志和帐户 ID 的方法。那时,您可以使用这些值做一些事情。

类方法与否是我认为在类更干净之后我们可以探索的细节。

于 2012-12-01T17:34:09.687 回答