在Ruby中将值设置为数字范围

时间:2014-01-29 15:08:53

标签: ruby

我的问题是我是否可以使用范围作为哈希中键:值对中的值。我正在研究一个问题,我试图返回一个字母等级(A-F)的平均数字等级(数组)。我有一个有效的解决方案,但我遇到了一些有趣的东西。这是我的代码:

def get_grade(array)

  avg = (array.inject {|num, x| num + x}) / array.length

  grades = {
  "A" => [90..10]
  "B" => [80..89],
  "C" => [70..79],
  "D" => [60..69],
  "F" => [0..59],
  }
  grades.default = "Error"

  puts grades.key(avg)
  end

arraya = [100,90,100,99,99]
puts get_grade(arraya)

我知道我可以用case或if语句返回字母等级。看起来我应该能够使用哈希,但它不起作用。为什么我不能设置范围为值的哈希?感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用案例陈述:

def get_grade(scores)
  case scores.inject(&:+) / scores.length
  when 90..100; 'A'
  when 80..89; 'B'
  when 70..79; 'C'
  when 60..69; 'D'
  when 0..59; 'F'
  else; 'Error'
  end
end

arraya = [100,90,100,99,99]
puts get_grade(arraya)
#=> A

答案 1 :(得分:2)

您可能希望重写您的方法,如下所示:

def get_grade(array)

  avg = array.inject(:+) / array.length

  grades = {
  "A" => (90..100),
  "B" => (80..89),
  "C" => (70..79),
  "D" => (60..69),
  "F" => (0..59),
  }     

  grade = grades.find{|key, range| range.include?(avg) }

  grade.nil? ? "Unknown" : grade.first

end

arraya = [100,90,100,99,99]

puts get_grade(arraya) # => A