数组的未定义方法

时间:2015-04-27 12:53:32

标签: ruby oop

所以我收到了错误消息"未定义的方法' ip_histogram' for#(NoMethodError)"使用以下代码

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
end

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

我试图读入数组并使用正则表达式进行检查。如果我从方法中取出代码并将其放入主程序中,它就可以工作,但我想知道为什么它不能用作方法。

2 个答案:

答案 0 :(得分:3)

您将CommonLog#readfile的结果分配给新变量cleaned_file。你没有提供任何输入,但我现在假设@readfile是array

这意味着你的代码将假设ip_histogram类上有一个实例方法Array,而实际上却没有。

您只是想按顺序运行这些以获得您之后的结果:

clog = CommonLog.new("test_log")
clog.readfile
clog.ip_histogram

这里的主要区别是我们不使用readfile的返回值,因为它只需要设置ip_histogram方法中的变量就可以工作。

答案 1 :(得分:0)

my_file.readfile的返回值是一个数组。除非您在ip_histogram课程中定义了Array,否则您无法在cleaned_file上调用它。

ip_histogram上定义Array(定义与您的代码不同):

class Array
  def ip_histogram
    ...
  end
end