【问题标题】:Ruby method variable declarationRuby 方法变量声明
【发布时间】:2015-04-27 02:06:48
【问题描述】:

我正在尝试定义解析 apache 日志文件并提取 IP 地址、URL、每小时请求数和错误代码的方法。我已经在方法之外完成了所有工作,但是在尝试将该代码放入方法时,我不断收到错误消息“堆栈级别太深”。这是有问题的代码。

   class CommonLog

    def initialize(logfile)
        @logfile = logfile
    end

    def readfile
         @readfile = File.readlines(@logfile).map { |line|
    line.split()
  }
  @readfile = @readfile.to_s.split(" ")
    end

    def ip_histogram
        @ip_count = 0
        @readfile.each_index { |index|
            if (@readfile[index] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ )
                puts @readfile[index]
                puts @ip_count += 1
            end
        }
    end

    def url_histogram
        url_count = 0 
        cleaned_file.each_index { |index|
            if (cleaned_file[index] =~ /\/{1}(([a-z]{4,})|(\~{1}))\:{0}\S+/ )
                puts cleaned_file[index]
                puts url_count += 1
            end
        }
    end

    def requests_per_hour
    end

    def sorted_list
    end

end

my_file = CommonLog.new("test_log")
cleaned_file = my_file.readfile
puts cleaned_file.ip_histogram

【问题讨论】:

  • 你的代码太长,你的解释不够。 “方法”是什么意思?您指的是 HTTP 方法还是 Ruby 方法?它是代码的哪一部分?你能删减你的代码,只留下相关的代码吗?另外,您能否从输入文件中包含两到三个示例行,以便我们自己测试您的代码?

标签: ruby class methods


【解决方案1】:

看来问题出在你CommonLog#readfile方法上:

def readfile
  @readfile = File.readlines(@logfile).map { |line|
    line.split()
  }
  @readfile = readfile.to_s.split(" ")
end

注意到readfile 的实现内部你递归调用readfile?当它执行时,它从文件中读取行,映射它们并将结果分配给@readfile;然后它调用readfile 并再次开始执行该方法;这种情况会一直持续下去,直到由于递归方法调用过多而导致堆栈炸毁。

我假设你的实际意思是:

@readfile = @readfile.to_s.split(" ")

【讨论】:

  • 谢谢!这解决了问题,但现在我有一个新的错误未定义方法 'ip_histogram' for #<0x2de048>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多