我有一个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上可以调用它,同时仍然保留它为其设计的功能?
答案 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。
这将是另一种选择,即创建一个包含学生阵列的课程。