有没有更好的方法来编写这个Ruby代码?请帮助重构。
def get_code(val)
case val
when 0..20 then 'E2'
when 20..32 then 'E1'
when 33..40 then 'D'
when 41..50 then 'C2'
when 51..60 then 'C1'
when 61..70 then 'B2'
when 71..80 then 'B1'
when 81..90 then 'A2'
when 91..100 then 'A1'
else 'A0'
end
end
答案 0 :(得分:2)
你的代码非常好。
为了好玩,您可以使用哈希而不是case
。
def get_code(val)
my_hash = { 0..20 => 'E2',
20..32 => 'E1',
33..40 => 'D',
41..50 => 'C2',
51..60 => 'C1',
61..70 => 'B2',
71..80 => 'B1',
81..90 => 'A2',
91..100 => 'A1' }
my_hash.select{ |k, v| k === val }.first[1] rescue 'A0'
end
或者更内联:)
def get_code(val)
{ 0..20 => 'E2', 20..32 => 'E1', 33..40 => 'D', 41..50 => 'C2', 51..60 => 'C1', 61..70 => 'B2', 71..80 => 'B1', 81..90 => 'A2', 91..100 => 'A1' }.select{ |k, v| k === val }.first[1] rescue 'A0'
end
并且,正如@Geo注意到的那样,你应该从方法中提取你的哈希值。
答案 1 :(得分:1)
如果这是这种模式的唯一实例,则不值得缩短;它非常清晰,并且不是很嘈杂。
答案 2 :(得分:1)
def get_code(val)
if [31, 32].include?(val) then 'E1'
else ['E2', 'E2', 'E1', 'D', 'C2', 'C1', 'B2', 'B1', 'A2', 'A1'][(val-1)/10] || 'A0'
end
end
我不确定你是如何处理0,否定的。它看起来像一个评分系统。如果我的代码出错,我认为你可以修复它。
<强>更新强> 另一个版本:
def get_code(val)
val += 1 if 0 == val
val -= 2 if [31, 32].include?(val)
['E2', 'E2', 'E1', 'D', 'C2', 'C1', 'B2', 'B1', 'A2', 'A1'][(val-1)/10] || 'A0'
end
答案 3 :(得分:1)
不是重构,只是一种较短的编写方式:
def get_code(val)
case val
when 0..20
'E2'
when 20..32
'E1'
when 33..40
'D'
when 41..50
'C2'
# etc.
else
'A0'
end
end
或者你可以用分号代替然后:
case val
when 0..20; 'E2'
when 20..32; 'E1'
#etc
else 'A0'
end