Ruby on rails 如何解决未定义的方法&x27;[]和#x27;对于类错误?

Ruby on rails 如何解决未定义的方法&x27;[]和#x27;对于类错误?,ruby-on-rails,ruby,class,oop,Ruby On Rails,Ruby,Class,Oop,每次运行代码时,我都会遇到以下错误 undefined method '[]' for nilClass: NoMethodError 有两个类,LineAnalyzer和Solution类,问题似乎出在LineAnalyzer计算单词频率的方法中,但我找不到错误 代码如下所示: class LineAnalyzer attr_accessor :highest_wf_count, :highest_wf_words, :linesCount, :content , :line_numbe

每次运行代码时,我都会遇到以下错误

undefined method '[]' for nilClass: NoMethodError
有两个类,
LineAnalyzer
Solution
类,问题似乎出在
LineAnalyzer
计算单词频率的方法中,但我找不到错误

代码如下所示:

class LineAnalyzer
  attr_accessor :highest_wf_count, :highest_wf_words, :linesCount, :content , :line_number

  @highest_wf_count = Hash.new(0)
  @highest_wf_words = Array.new(0)
  @content 
  @line_number

  def initialize(line, line_num)
    @content = line
    @line_number = line_num
    calculate_word_frequency()
  end

  def calculate_word_frequency()
    @content.split.each do |word|
      @highest_wf_count[word.downcase] += 1
    end
    max = 0
    @highest_wf_count.each_pair do |key, value| 
      if value > max 
        max = value
      end
    end
    word_frequency.each_pair do |key, value| 
      if value == max 
        @highest_wf_words << key
      end
    end 
  end
end

class Solution
  attr_accessor :highest_count_across_lines, :highest_count_words_across_lines, :line_analyzers

  @highest_count_across_lines = Hash.new()
  @highest_count_words_across_lines = Hash.new()
  @line_analyzers = Array.new()

  def analyze_file
    line_count = 0
    x = File.foreach('C:\x\test.txt')
    x.each do |line|
      line_count += 1
      @line_analyzers << LineAnalyzer.new(line, line_count)
    end
  end
end

solution = Solution.new
# Expect errors until you implement these methods
solution.analyze_file
类线性分析器
属性访问器:最高\u wf\u计数,:最高\u wf\u字,:行内容,:行编号
@最高\u wf\u计数=散列。新(0)
@最高\u wf\u字=数组。新建(0)
@内容
@行号
def初始化(行,行数)
@内容=行
@行数=行数
计算单词频率()
结束
def计算单词频率()
@content.split.each do|单词|
@最高\u wf\u计数[word.downcase]+=1
结束
最大值=0
@最高的_wf_计数。每个_对做|键,值|
如果值>最大值
最大值=最大值
结束
结束
单词频率。每个单词对都有键、值
如果值==最大值
@最高的单词试试这个:

def calculate_word_frequency()
  @content.split.each do |word|
    next if word.blank?
    @highest_wf_count[word.downcase]+=1
  end
  max =0 
  @highest_wf_count.each_pair do |key, value| 
   if value > max 
     max = value
   end
  end
  word_frequency.each_pair do |key, value| 
   if value == max 
    @highest_wf_words << key
   end
  end 
end
def计算单词频率()
@content.split.each do|单词|
下一个如果word.blank?
@最高\u wf\u计数[word.downcase]+=1
结束
最大值=0
@最高的_wf_计数。每个_对做|键,值|
如果值>最大值
最大值=最大值
结束
结束
单词频率。每个单词对都有键、值
如果值==最大值

@最高\u wf\u单词数看起来您的问题是,当您试图在第一次看到单词时增加单词数时,您使用的哈希没有该键,因此无法增加它。第一次看到关键点时,应将其设置为1,并且所有出现的情况都应使其递增:

class LineAnalyzer
    attr_accessor :highest_wf_count, :highest_wf_words, :linesCount, :content , :line_number

    def initialize(line,line_num)
        @highest_wf_count = Hash.new(0)
        @highest_wf_words = Array.new(0)
        @content = line
        @line_number = line_num
        calculate_word_frequency()
    end

   def calculate_word_frequency()
       @content.split.each do |word|
           highest_wf_count.key?(word.downcase) ? @highest_wf_count[word.downcase]+=1 : @highest_wf_count[word.downcase]=1
       end
       max =0 
       @highest_wf_count.each_pair do |key, value| 
           if value > max 
              max = value
           end
        end
       highest_wf_count.each_pair do |key, value| 
          if value == max 
             @highest_wf_words << key
          end
       end 
    end
end

class Solution
    attr_accessor :highest_count_across_lines, :highest_count_words_across_lines, :line_analyzers
    @highest_count_across_lines = Hash.new()
    @highest_count_words_across_lines = Hash.new()

    def analyze_file
      line_count = 0
      x = File.foreach('C:\x\test.txt')
      x.each{ |line|
        line_count +=1
        line_analyzer << LineAnalyzer.new(line,line_count)
      }
      puts "line_analyzer: #{line_analyzer.inspect}"
   end

    def line_analyzer
        @line_analyzers ||= Array.new
    end
end
类线性分析器
属性访问器:最高\u wf\u计数,:最高\u wf\u字,:行内容,:行编号
def初始化(行,行数)
@最高\u wf\u计数=散列。新(0)
@最高\u wf\u字=数组。新建(0)
@内容=行
@行数=行数
计算单词频率()
结束
def计算单词频率()
@content.split.each do|单词|
最高\u wf\u计数。关键字?(字。小写)@最高计数[word.downcase]+=1:@最高计数[word.downcase]=1
结束
最大值=0
@最高的_wf_计数。每个_对做|键,值|
如果值>最大值
最大值=最大值
结束
结束
最高的_wf_计数。每个_对做|键,值|
如果值==最大值

@尤兰达,你好!我发现一个关于LineAnalyzer类中的最高\u wf\u计数的错误。 我的意思是“最高的计数值是3”。见下文

class LineAnalyzer

    attr_accessor :highest_wf_count, :highest_wf_hash, :highest_wf_words, :linesCount, :content , :line_number

    def initialize(line,line_num) #<--- taking a line of text (content) and a line number
        @highest_wf_hash = Hash.new(0) 
        @highest_wf_count = highest_wf_count #<--- a number with maximum number of occurrences for a single word (calculated)
        @highest_wf_words = Array.new(0) #<--- an array of words with the maximum number of occurrences (calculated)
        @content = line #<--- the string analyzed (provided)
        @line_number = line_num #<--- the line number analyzed (provided)
        calculate_word_frequency()
    end

   def calculate_word_frequency()
       @content.split.each do |word|
           highest_wf_hash.key?(word.downcase) ? @highest_wf_hash[word.downcase]+=1 : @highest_wf_hash[word.downcase]=1
       end
       @highest_wf_count = 0
       @highest_wf_hash.each_pair do |key, value| 
           if value > @highest_wf_count 
              @highest_wf_count = value

           end
        end
       highest_wf_hash.each_pair do |key, value| 
          if value == @highest_wf_count 
             @highest_wf_words << key
             @highest_wf_count == value
          end
       end 
    end
end
类线性分析器
属性访问器:最高\u wf\u计数,:最高\u wf\u哈希,:最高\u wf\u字,:linescont,:content,:line\u编号

def initialize(line,line_num)#在
word_frequency中声明
word_frequency
的位置。每对do |键、值|
word_frequency应该是@highest_wf_count。。。代码中的错误我认为您将类实例变量与实例变量混合在一起,希望此链接可以帮助您。基本上,您将@highest\u wf\u words声明为类实例变量,并试图将其用作实例变量,这就是为什么会出现此错误,因为在@highest\u wf\u count[word.downcase]+=1行中,该变量被声明为类实例变量。try
File.open('C:\x\test.txt'))
我的问题是在尝试添加LineAnalyzer时调用File.foreach('C:\x\test.txt')do | line | prashant402 nomethoder错误objects@Yolanda您能否将
开始@LineAnalyzers e logger.error e.message logger.error e.backtrace.join(“\n”)结束
以了解有关错误的更多信息没有任何区别,当我尝试向lineAnalyzers数组=>@lineAnalyzers@Yolanda添加值时出错,@lineAnalyzers@Hawkey001的问题您所做的代码修复是一个救命稻草。。。我现在明白什么意思了。谢谢大家请参考此链接:有人用几行文字帮我解决了这个问题,然后你可以尝试在课堂上解决这个问题: