You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby TDD练习求助:如何实现学习后成绩提升功能

解决Ruby TDD练习中的成绩升级问题

嘿,你这个问题其实有几种很实用的解决思路,计数器确实是完全可行的方案之一,当然我们也可以用更灵活的等级映射方式来实现。我给你详细拆解下两种方案,都能完美通过你的第二个测试~

方案一:使用计数器直接控制等级

我们可以给Student类添加一个学习次数的实例变量,每次调用study方法时增加计数,再根据计数来对应不同的成绩等级。这样逻辑清晰,很容易理解:

class Student
  attr_reader :grade

  def initialize(grade = "C")
    @grade = grade
    # 根据初始成绩设置对应的学习次数基准
    @study_count = case grade
                   when 'C' then 0
                   when 'B' then 1
                   when 'A' then 2
                   else 0
                   end
  end

  def study
    # 最多升到A,所以次数达到2后不再增加
    @study_count += 1 unless @study_count >= 2
    # 根据当前学习次数更新成绩
    @grade = case @study_count
             when 0 then 'C'
             when 1 then 'B'
             when 2 then 'A'
             else 'A'
             end
  end
end

方案二:使用等级数组映射(扩展性更强)

如果以后可能需要增加更多成绩等级(比如D、A+这类),用数组来维护等级顺序会更灵活。我们可以定义一个固定的等级数组,通过索引来控制当前成绩:

class Student
  # 定义成绩等级的顺序,后续扩展只需要修改这个数组
  GRADE_LEVELS = ['C', 'B', 'A'].freeze

  attr_reader :grade

  def initialize(grade = "C")
    # 确保初始成绩在合法范围内,默认回到C
    current_index = GRADE_LEVELS.index(grade) || 0
    @current_grade_index = current_index
    @grade = GRADE_LEVELS[current_index]
  end

  def study
    # 只有当前没到最高等级时才升级
    if @current_grade_index < GRADE_LEVELS.length - 1
      @current_grade_index += 1
      @grade = GRADE_LEVELS[@current_grade_index]
    end
  end
end

验证效果

这两种方案都能完美通过你的测试:

def test_grade_can_improve
  student = Student.new
  student.study
  assert_equal "B", student.grade
  student.study
  assert_equal "A", student.grade
end

而且额外处理了边界情况:如果学生初始成绩已经是A,多次调用study也不会改变成绩,符合逻辑。

回到你的问题:计数器是完全合理的选择,方案一就是基于计数器的直接实现,方案二的索引其实也是计数器的一种变种,都能满足你的需求。如果只是当前的C→B→A需求,两种方案都好用;如果考虑未来扩展,方案二更值得推荐。

内容的提问来源于stack exchange,提问作者cjl85

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:41