运行我的以下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
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
虽然您可以采用类方法方法,但似乎还有一些进展。
您应该将提取逻辑放在一个方法中,而不是让它在您的类中挂起。然后在类之外,有一个AccountLog实例,您可以在其中调用日志和帐户ID提取方法。那时你可以用这些值做点什么。
类方法与否是我认为在课程更干净之后我们可以探索的细节。