首页 > 解决方案 > 如何改进嵌套条件

问题描述

你能帮我改进这些代码吗?

def print_last_frame(result, frame, i)
    line = ''
    if frame.strike?
      if frame.result.reduce(:+) == 30
        line += "X\t X\t X"
      elsif frame.result.reduce(:+) == 20
        line += "X\t #{frame.result[1]}\t /"
      else
        line += "X\t #{frame.result[1]}\t #{frame.result[2]}"
      end
    elsif frame.spare?
      if frame.result.reduce(:+) == 20
        line +=  "#{frame.result[0]}\t /\t X"
      else
        line +=  "#{frame.result[0]}\t /\t #{frame.result[2]}"
      end
    else
      line += "#{result.shots[i]}\t #{result.shots[i+1]}"
    end
    line
  end

我担心条件

标签: ruby

解决方案


我的第一个想法是:使用带有Hash#default的 Hash :

line = ""

strike = {20 => "20", 30 => "30"}
strike.default = "other"

line += strike[0]

line
#=> "other"

没有测试,但你应该能够写出类似的东西

def print_last_frame(result, frame, i)
  result = frame.result
  shots = result.shots

  cases = {
    strike: {20 => "X\t #{result[1]}\t /",
             30 => "X\t X\t X"},
    spare:  {20 =>"#{result[0]}\t /\t X"}

  cases[:strike].default = "X\t #{result[1]}\t #{result[2]}"
  cases[:spare].default = "#{result[0]}\t /\t #{result[2]}"
  cases.default = {}
  cases.default.default = "#{shots[i]}\t #{shots[i+1]}"

  cases[frame.value][result.sum]
end

无论是frame.value退货:strike:spare还是nil


推荐阅读