首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中创建域模型,将学生添加到学校名册

在Ruby中创建域模型,将学生添加到学校名册
EN

Stack Overflow用户
提问于 2017-02-09 04:02:18
回答 1查看 725关注 0票数 0

您应该能够通过调用add_student方法并为其提供学生姓名和年级的论据来将学生添加到学校。

假设我们将学生"AC Slater“添加到9年级。如果名册上已经有了9年级的键,那么我们就可以将AC Slater推入到9级键所指向的数组中。否则,我们需要首先创建9级的键,并将其指向一个空数组。但是,如果我们所处的场景中的9级键已经存在,我们将通过创建一个9键并将其设置为一个空数组来删除它的当前内容!

期望的行为:

代码语言:javascript
复制
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"]}

到目前为止我所拥有的是:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-09 04:28:56

if add_student方法的条件:if @roster[grade] == true实际上永远不会以您认为的方式工作,因为当您使用不存在的键访问哈希时,它返回nil,否则返回值。

当键不存在时:

代码语言:javascript
复制
@roster = {}
@roster[9] #=> nil

而对于现有的键值,则返回:

代码语言:javascript
复制
@roster = { 9 => ["AC Slater"] }
@roster[9] #=> ["AC Slater"]

因此,当键存在时,您比较if ["AC Slater"] == true,当然这是一个假条件,因此您的代码总是执行else条件。因此,在@roster哈希中,总是只有一个级别的值。

一个小小的改变会使它发挥作用:

代码语言:javascript
复制
def add_student(student_name, grade)
  if @roster[grade]
    @roster[grade] << student_name
  else
    @roster[grade] = []
    @roster[grade] << student_name
  end
end

但是,如果你不喜欢这样的条件,像我一样。您可以从通过一个街区@roster,它在哈希键为initialized时存储默认数组。

代码语言:javascript
复制
def initialize(school_name)
  @school_name = school_name
  @roster = Hash.new{ |h, k| h[k] = [] }
end

当键不存在时,每次尝试获取键时,该块都将被执行,否则,它将为它创建一个空数组,否则返回值。因此,您现在可以安全地将您的add_student方法更改为:

代码语言:javascript
复制
def add_student(student_name, grade)
    @roster[grade] << student_name
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42127991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档