2015-06-02 38 views
1

有沒有一種方法來重構此代碼,並使其更清潔?你能用更少的布爾值來解決這個問題嗎?重構如果elsif其他在Ruby

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 

回答

8

如何使用Rangecase聲明?

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 
+2

啊。可悲的是沒有人使用「之間? '。我喜歡'grade.between?(1,100)'比'(1..100)好.cover?(grade)' – steenslag

+0

@steenslag:TIL'''好得多。謝謝。 – spickermann

+0

如果0到100是可以接受的值,你不想讓最小/最大值爲'grade.between?(0,100)'?此外,在列出的四種情況中的兩種情況下,值90,80和70都是正確的。可能希望這些範圍是「80 ... 89」,「70 ... 79」和「50 ... 69」。 – digijim

3

大班,效率是最重要的:

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" 
+0

這是一個很酷的解決方案 –