在Ruby中将该值设置为一个数字范围
我的问题是是否可以使用范围作为散列中的key:value对中的值。我正在研究一个问题,我试图返回一个字母a-F,表示数值等级数组的平均值。我有一个可行的解决方案,但我遇到了一些有趣的事情。这是我的密码:在Ruby中将该值设置为一个数字范围,ruby,Ruby,我的问题是是否可以使用范围作为散列中的key:value对中的值。我正在研究一个问题,我试图返回一个字母a-F,表示数值等级数组的平均值。我有一个可行的解决方案,但我遇到了一些有趣的事情。这是我的密码: def get_grade(array) avg = (array.inject {|num, x| num + x}) / array.length grades = { "A" => [90..10] "B" => [80..89], "C" =>
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语句返回字母等级。看起来我应该可以用散列来代替,但它不起作用。为什么我不能设置一个以范围为值的散列呢?谢谢。您可能需要按照以下方式重写您的方法:
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
您可能希望按照以下方式重写您的方法:
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
您可以使用案例陈述:
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
您可以使用案例陈述:
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
您在a行中缺少逗号,可能还缺少100中的0。您还应该添加更详细的预期结果,当我修复该错误时,我没有得到有用的输出。我可能会让它生成输出,但不知道您的意图。您的行中缺少一个逗号,可能是a的100中的0。您还应该更详细地添加预期结果,当我修复该错误时,我没有得到有用的输出。我可以让它产生输出,但不知道你想要什么,特别是考虑到你的年龄。一个变量是min_to_ltr={90=>'A',80=>'B',70=>'C',60=>'D',0=>'F'},然后min_to_ltr[min_to_ltr.keys.find]{| v | v这正是我想做的。谢谢!你能带我看一下最后一行吗?我不完全理解。Beagle,枚举哈希等级的每个元素,直到它在块中找到一个计算为true的元素,在这种情况下,它返回该元素。如果块对等级的所有元素计算为false或nil,find返回nil。散列的每个元素由一个键和一个值组成,由块的局部变量、键和范围表示。@Cary Swoveland感谢您的详细解释。@beaglebets平均分数可能会超出0..100范围。例如,如果通过[100,110]对于该方法,平均得分将为105。在这种情况下,该方法将返回'Unknown'Nice,特别是考虑到您的年龄。一个变量将是min_to_ltr={90=>'A',80=>'B',70=>'C',60=>'D',0=>'F',然后min u to_ltr[min u to_to_ltr.keys.find]{| v | v这正是我想做的。谢谢!你能带我看一下最后一行吗?我不完全理解。Beagle,枚举哈希等级的每个元素,直到它在块中找到一个计算为true的元素,在这种情况下,它返回该元素。如果块对等级的所有元素计算为false或nil,find返回nil。散列的每个元素由一个键和一个值组成,由块的局部变量、键和范围表示。@Cary Swoveland感谢您的详细解释。@beaglebets平均分数可能会超出0..100范围。例如,如果通过[100,110]对于该方法,平均得分为105。在这种情况下,该方法将返回“未知”