您应该能够通过调用add_student方法并为其提供学生姓名和年级的论据来将学生添加到学校。
假设我们将学生"AC Slater“添加到9年级。如果名册上已经有了9年级的键,那么我们就可以将AC Slater推入到9级键所指向的数组中。否则,我们需要首先创建9级的键,并将其指向一个空数组。但是,如果我们所处的场景中的9级键已经存在,我们将通过创建一个9键并将其设置为一个空数组来删除它的当前内容!
期望的行为:
school.add_student("AC Slater", 9)
school.add_student("Kelly Kapowski", 10)
school.add_student("Screech", 11)
school.roster
# => {9 => ["Zach Morris", "AC Slater"], 10 => ["Kelly Kapowski"], 11 => ["Screech"]}到目前为止我所拥有的是:
class School
attr_accessor :roster, :student_name, :school_name
def initialize(school_name)
@school_name = school_name
@roster = {}
end
def add_student(student_name, grade)
if @roster[grade] == true
@roster[grade] << student_name
else
@roster[grade] = []
@roster[grade] << student_name
end
end
end发布于 2017-02-09 04:28:56
if add_student方法的条件:if @roster[grade] == true实际上永远不会以您认为的方式工作,因为当您使用不存在的键访问哈希时,它返回nil,否则返回值。
当键不存在时:
@roster = {}
@roster[9] #=> nil而对于现有的键值,则返回:
@roster = { 9 => ["AC Slater"] }
@roster[9] #=> ["AC Slater"]因此,当键存在时,您比较if ["AC Slater"] == true,当然这是一个假条件,因此您的代码总是执行else条件。因此,在@roster哈希中,总是只有一个级别的值。
一个小小的改变会使它发挥作用:
def add_student(student_name, grade)
if @roster[grade]
@roster[grade] << student_name
else
@roster[grade] = []
@roster[grade] << student_name
end
end但是,如果你不喜欢这样的条件,像我一样。您可以从通过一个街区到@roster,它在哈希键为initialized时存储默认数组。
def initialize(school_name)
@school_name = school_name
@roster = Hash.new{ |h, k| h[k] = [] }
end当键不存在时,每次尝试获取键时,该块都将被执行,否则,它将为它创建一个空数组,否则返回值。因此,您现在可以安全地将您的add_student方法更改为:
def add_student(student_name, grade)
@roster[grade] << student_name
endhttps://stackoverflow.com/questions/42127991
复制相似问题