Ruby,价值优惠,美化代码

所以我有这个代码:

def self.age_to_bucket(age) age = age.to_i if age >= 0 && age = 13 && age = 18 && age = 25 && age = 30 && age = 35 && age = 40 && age = 50 && age = 65 9 else 0 end end 

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

我知道我可以使用#in? 有范围,像这样:

 if age.in? (0..12) 

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

一种方法是使用案例

 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 

另一种方法是消除条件中的冗余&&。

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

你可以改写if age.in? (0..12) if age.in? (0..12)(0..12).include? age (0..12).include? age ,这是香草ruby 。

只是为了好玩(这不是有效的方式,但对于小型arrays就好了):

 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 

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

 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