2013-11-25 23 views
1

我有以下代碼使用範圍在導軌映射數組值

考慮這是作爲範圍作爲輸入

ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"] 

def price_ranges ranges 
    ranges.collect{|x| x.split('-')}.map { 
     |ar| 
     Range.new(Integer(ar.first), Integer(ar.second)) 
      if Range.new(Integer(ar.first), Integer(ar.second)).eql?(25001..0) 
      Range.new(Integer(ar.first), Float::INFINITY) 
      end 
    } 
    end 

實際輸出我需要的是

[1000..2000, 2001..5000, 5001..25000, 25001..Infinity] 

但是我得到像

[nil, nil, nil, 25001..Infinity] 

如何修改上面的代碼

回答

0

試試這個:

ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"] 

    def price_ranges ranges 
     ranges.collect{|x| x.split('-')}.map { 
      |ar| 
       range = Range.new(Integer(ar.first), Integer(ar.second)) 
       if range.eql?(25001..0) 
       Range.new(Integer(ar.first), Float::INFINITY) 
       else 
       range 
       end 
     } 
     end 

爲了您的數組,你是從if評價得到nil的前3個元素

0

你可以在你的ranges陣列的map內使用gsub

1.9.3p448 :008 > ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"] 
=> ["1000-2000", "2001-5000", "5001-25000", "25001-0"] 

1.9.3p448 :010 > ranges.map {|range| range.gsub(/-/, "..") } 
=> ["1000..2000", "2001..5000", "5001..25000", "25001..0"] 

然後你的循環中,您可以eval每個字符串:

1.9.3p448 :016 > eval(ranges.map {|range| range.gsub(/-/, "..") }.first) 
=> 1000..2000 

1.9.3p448 :017 > _.class 
=> Range 

注意如果你想要Infinity,你可以使用:

1.9.3p448 :012 > 1.0/0.0 
=> Infinity