Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中将该值设置为一个数字范围_Ruby - Fatal编程技术网

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

在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" =>

我的问题是是否可以使用范围作为散列中的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" => [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。在这种情况下,该方法将返回“未知”