Ruby,价值优惠,美化代码

时间:2011-12-16 08:42:38

标签: ruby

所以我有这段代码:

def self.age_to_bucket(age)
  age = age.to_i

  if age >= 0 && age <= 12
    1
  elsif age >= 13 && age <= 17
    2
  elsif age >= 18 && age <= 24
    3
  elsif age >= 25 && age <= 29
    4
  elsif age >= 30 && age <= 34
    5
  elsif age >= 35 && age <= 39
    6
  elsif age >= 40 && age <= 49
    7
  elsif age >= 50 && age <= 64
    8
  elsif age >= 65
    9
  else
    0
  end
end

如何在不失去可读性的情况下改进此代码?

我知道我可以将#in?用于范围,如下所示:

if age.in? (0..12)

但是#in?在ActiveSupport中,我宁愿使用更独立的方式。

5 个答案:

答案 0 :(得分:6)

一种方法是使用案例

result = case age
 when 0..12 then 1
 when 13..17 then 2
 when 18..24 then 3
 when 25..29 then 4
 -------- so on
 else 0
end

另一种方法是消除冗余&amp;&amp;在这种情况下。

if age < 0 
  0
elsif age < 13
  1
elsif age < 18
  2
elsif age < 25
  3
elsif age < 30
  4
elsif age < 35
  5
elsif age < 40
  6
elsif age < 50
  7
elsif age < 65
  8
else
  9

答案 1 :(得分:2)

def self.age_to_bucket age
  case age=age.to_i
    when  0..12 then 1
    when 13..17 then 2
    when 18..24 then 3
    when 25..29 then 4
    when 30..34 then 5
    when 35..39 then 6
    when 40..49 then 7
    when 50..64 then 8
    else age >= 65 ? 9 : 0
  end
end

答案 2 :(得分:1)

您可以将if age.in? (0..12)重写为(0..12).include? age vanilla Ruby

答案 3 :(得分:1)

只是为了好玩(这不是有效的方法,但对于小阵列来说很好):

ranges = [0, 13, 18, 25, 30, 35, 40, 50, 65, Float::INFINITY].each_cons(2).map { |a, b| (a..b) }
n = ranges.map.with_index { |range, idx| idx if range.include?(15) }.compact.first + 1 
#=> 2

请注意,如果间隔是动态的,则必须以类似的方式实现它。

答案 4 :(得分:0)

irb(main):010:0> a = {1 => 0..12, 2 => 13..17} # insert other values here
=> {1=>0..12, 2=>13..17}
irb(main):011:0> age = 16
=> 16
irb(main):012:0> a.keys.find {|k| a[k].include?(age) }
=> 2