ruby,没有方法错误

ruby,没有方法错误,ruby,Ruby,在运行我的以下ruby脚本时,我收到以下错误: s3parse.rb:12:in `block in <class:AccountLog>': undefined method `extract_account_id' for AccountLog:Class (NoMethodError) def extract\u account\u id将定义一个实例方法 按照您调用它的方式,您需要一个类方法 定义如下: def self.extract_account_id(line)

在运行我的以下ruby脚本时,我收到以下错误:

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

def extract\u account\u id
将定义一个实例方法

按照您调用它的方式,您需要一个类方法

定义如下:

def self.extract_account_id(line)
或者,由于您已经有一个
AccountLog
实例,请使用它调用
extract\u account\u id

account_log.account_id = account_log.extract_account_id(line)
请注意,使用第二种方法,您不需要更改方法定义,只需通过
帐户日志
实例调用
提取帐户id

我想你应该把
s3log=File…
放在类定义之外

或者改用常量:
S3log=…


然后您可以访问它,因为
AccountLog::S3log

def extract\u account\u id
将定义一个实例方法

按照您调用它的方式,您需要一个类方法

定义如下:

def self.extract_account_id(line)
或者,由于您已经有一个
AccountLog
实例,请使用它调用
extract\u account\u id

account_log.account_id = account_log.extract_account_id(line)
请注意,使用第二种方法,您不需要更改方法定义,只需通过
帐户日志
实例调用
提取帐户id

我想你应该把
s3log=File…
放在类定义之外

或者改用常量:
S3log=…


然后您可以通过
AccountLog::S3log

访问它,您有什么理由不认为它应该是一个类方法吗?您正在类方法的上下文中使用它,这就是为什么它说类AccountLog没有这样的方法

如果您将您的方法命名为
self.extract\u account\u 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

你有什么理由不认为它应该是一个类方法吗?您正在类方法的上下文中使用它,这就是为什么它说类AccountLog没有这样的方法

如果您将您的方法命名为
self.extract\u account\u 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

虽然可以采用类方法,但似乎还有更多的方法

您应该将提取逻辑放在方法本身中,而不是让它挂在类中。然后在类之外,有一个AccountLog实例,您可以在其中调用方法来提取日志和帐户id。在这一点上,你可以用这些值做一些事情


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

虽然您可以采用类方法方法,但似乎还有更多的内容

您应该将提取逻辑放在方法本身中,而不是让它挂在类中。然后在类之外,有一个AccountLog实例,您可以在其中调用方法来提取日志和帐户id。在这一点上,你可以用这些值做一些事情


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

你能发布s3parse.rb或至少是使用AccountLog类的相关部分吗?嗨-这是整个类和文件,我只是从命令行运行该文件,我的目标是将正则表达式重构成单独的方法,以使其更好地读取。您到底想用s3log变量做什么?如果这是一个ruby脚本,你应该把逻辑移到类之外。你能发布s3parse.rb或者至少是使用AccountLog类的相关部分吗?嗨,这是整个类和文件,我只是从命令行运行该文件,我的目标是将正则表达式重构成单独的方法,以使其更好地读取。您到底想用s3log变量做什么?如果这是一个ruby脚本,你应该把这个逻辑移到类之外。谢谢大家。我把它改为帐户日志。提取帐户id(行),它工作正常。由于帐户ID的提取应该在一个实例(一个单独的s3log)上,我认为使用实例方法而不是类方法是有意义的。@BC00我可能错了,但您是从文件行提取ID以将其存储在实例中。这听起来更像是类方法的工作,而不是实例方法。即使您没有AccountLog的实例,也应该能够从一行文本中提取ID no?谢谢大家。我把它改为帐户日志。提取帐户id(行),它工作正常。由于帐户ID的提取应该在一个实例(一个单独的s3log)上,我认为使用实例方法而不是类方法是有意义的。@BC00我可能错了,但您是从文件行提取ID以将其存储在实例中。这听起来更像是类方法的工作,而不是实例方法。即使您没有AccountLog的实例,您也应该能够从一行文本no?