我有以下代码
考虑这是作为输入的范围
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 :(得分:0)
您可以在gsub
数组的map
内使用ranges
:
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
答案 1 :(得分: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
对于数组的前3个元素,您将从nil
评估中获得if