在Ruby中重构if-else

在Ruby中重构if-else,ruby,if-statement,Ruby,If Statement,有没有办法重构这段代码并使其更干净?你能用更少的布尔数来解决这个问题吗 def get_grade(grade_num) if grade_num > 100 return "Please enter a number between 0 and 100" elsif grade_num <=100 && grade_num >= 90 return 'A' elsif grade_num < 90 && gra

有没有办法重构这段代码并使其更干净?你能用更少的布尔数来解决这个问题吗

def get_grade(grade_num)
  if grade_num > 100
    return "Please enter a number between 0 and 100"
  elsif grade_num <=100 && grade_num >= 90
    return 'A'
  elsif grade_num < 90 && grade_num >= 80
    return 'B'
  elsif grade_num < 80 && grade_num >= 70
    return 'C'
  elsif grade_num < 70 && grade_num >= 60
    return 'D'
  elsif grade_num < 60
    return 'F'
  end
end 
def get_grade(grade_num)
如果等级数量>100
return“请输入一个介于0和100之间的数字”
elsif等级_num=90
返回“A”
elsif等级数量<90和等级数量>=80
返回“B”
elsif等级数量<80和等级数量>=70
返回“C”
elsif等级数量<70和等级数量>=60
返回'D'
elsif等级数量<60
返回“F”
终止
终止

使用
范围
案例
语句怎么样

def get_grade(grade)
  case grade
  when 90..100 then 'A'
  when 80...90 then 'B'
  when 70...80 then 'C'
  when 60...70 then 'D'
  when  0...60 then 'F'
  else      
    'Please enter a number between 0 and 100'
  end
end

使用
Range
case
语句怎么样

def get_grade(grade)
  case grade
  when 90..100 then 'A'
  when 80...90 then 'B'
  when 70...80 then 'C'
  when 60...70 then 'D'
  when  0...60 then 'F'
  else      
    'Please enter a number between 0 and 100'
  end
end

对于效率至上的大型课程:

GRADES = {
  ( 0...60) => "Fail",
  (60...70) => "D",
  (70...80) => "C",
  (80...90) => "B",
  (90..100) => "A" }

TO_MARK = GRADES.flat_map { |r,mark| r.to_a.product([mark]) }.to_h
  #=> {0=>"Fail", 1=>"Fail",..., 59=>"Fail", 60=>"D",..., 69=>"D",
  #    70=>"C",..., 79=>"C", 80=>"B",..., 89=>"B", 90=>"A",..., 100=>"A"} 

TO_MARK[33] #=> "Fail" 
TO_MARK[65] #=> "D" 
TO_MARK[80] #=> "B" 
TO_MARK[90] #=> "A" 

对于效率至上的大型课程:

GRADES = {
  ( 0...60) => "Fail",
  (60...70) => "D",
  (70...80) => "C",
  (80...90) => "B",
  (90..100) => "A" }

TO_MARK = GRADES.flat_map { |r,mark| r.to_a.product([mark]) }.to_h
  #=> {0=>"Fail", 1=>"Fail",..., 59=>"Fail", 60=>"D",..., 69=>"D",
  #    70=>"C",..., 79=>"C", 80=>"B",..., 89=>"B", 90=>"A",..., 100=>"A"} 

TO_MARK[33] #=> "Fail" 
TO_MARK[65] #=> "D" 
TO_MARK[80] #=> "B" 
TO_MARK[90] #=> "A" 

啊。不幸的是,没有人在这两者之间使用
。我喜欢
grade.between?(1100)
(1..100)好。cover?(grade)
@steenslag:TIL
between
好得多。谢谢。如果0到100是可接受的值,您不希望最小/最大值为
等级。介于?(0,100)
之间吗?此外,在列出的四种情况中,有两种情况下的值为90、80和70。可能希望这些范围是
80…89
70…79
,和
50…69
。你一直都是个软蛋。虽然OP已将通过门槛设置为60,但您已将其降至50。我更喜欢
cover?
,因为不熟悉
的人(像我一样)可能不知道它是包含还是不包含终点,而(对我来说)
cover?
听起来是包含的。@digijim:一个有三个点的范围,如
80…90
排除了最后一个元素。啊。不幸的是,没有人在这两者之间使用
。我喜欢
grade.between?(1100)
(1..100)好。cover?(grade)
@steenslag:TIL
between
好得多。谢谢。如果0到100是可接受的值,您不希望最小/最大值为
等级。介于?(0,100)
之间吗?此外,在列出的四种情况中,有两种情况下的值为90、80和70。可能希望这些范围是
80…89
70…79
,和
50…69
。你一直都是个软蛋。虽然OP已将通过门槛设置为60,但您已将其降至50。我更喜欢
cover?
,因为不熟悉
的人(像我一样)可能不知道它是包含还是不包含终点,而(对我来说)
cover?
听起来是包含的。@digijim:一个有三个点的范围,如
80…90
排除了最后一个元素。