在同一个类的实例上调用实例方法时出现未定义的方法错误

时间:2013-12-01 14:59:35

标签: ruby class csv methods instance

我有一个csv文件:

Name,Grade
John Smith,75
Sally Field,85

等......。

我正在使用以下类在单独的文件'test_scores.rb'中阅读:

require'csv'
require_relative('./test_scores_student_class')

class TestScores
  attr_accessor :filename

  def initialize(filename)
    @filename = filename
  end

  def make_score_list
    score_list = []
    CSV.foreach(@filename, headers:true) do |record|
      name = record['Name']
      grade = record['Grade'].to_i

      student = Student.new(name, grade)
      score_list << student
    end

    score_list
  end

  def grade_count
    a = []
    b = []
    c = []
    d = []
    self.each do |student|
      binding.pry
      if student['Grade'] >= 90
        a << student
      elsif student['Grade'] >= 80 && student['Grade'] < 90
        b << student
      elsif student['Grade'] >= 70 && student['Grade'] < 80
        c << student
      else
        d << student
      end
    end
    puts ">= 90: #{a.count}"
    puts ">= 80: #{b.count}"
    puts ">= 70: #{c.count}"
    puts " < 70: #{d.count}"
  end

end

test_scores = TestScores.new('scores.csv')
grade_list = test_scores.make_score_list
grade_list.grade_count

当我尝试在grade_list数组上调用方法grade_count时,我得到了未定义的方法错误。如何重新编写方法,以便在grade_list上可以调用它,同时仍然保留它为其设计的功能?

2 个答案:

答案 0 :(得分:1)

您的grade_list是一个数组,而不是您的TestScores类的实例。因此,grade_list没有名为grade_count的方法。

要解决此问题,您可以将grade_count作为类函数并使用类似TestScores.grade_count(grade_list)的数组参数调用它,或者您可以将TestScores类设为Enumerable并使make_score_list返回一个数组。

答案 1 :(得分:1)

好好猜测你的意图。 make_score_list方法中的score_list应该是实例变量

然后成绩计数应该是@ score_list.each。

另一种方法是让它们都是类方法,一个返回一个Student数组,另一个方法将它作为参数。

代码问题是grade_count是TestScores上的一种方法,而不是score_list。

这将是另一种选择,即创建一个包含学生阵列的课程。