表示数字的字符串之间的空范围

时间:2013-03-27 12:29:27

标签: ruby ruby-1.8

这是两个范围值。

('1'..'10').to_a   => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

但是,

('2'..'10').to_a  => []

为什么第二个在ruby 1.8.7中返回一个空数组?

4 个答案:

答案 0 :(得分:5)

irb(main):001:0> '2' > '10'
=> true
irb(main):002:0> '1'>'10'
=> false

由于字符串比较算法,无法使用大于上限的下限创建范围。

实际它适用于1.9.3。奇怪。

答案 1 :(得分:5)

问题是Ruby 1.8正在尝试确定('2'..'10')是否是有效范围,作为其分析代码的一部分,并确定它是无效的。 '2''10'向后调整范围值后排序。

当人们尝试对字符串值进行排序时,这是一个常见的问题,他们会一次又一次地遇到它,直到他们知道该技巧永远不会有效。

使用1.8.7:

('2'..'10').to_a
=> []
('02'..'10').to_a
=> ["02", "03", "04", "05", "06", "07", "08", "09", "10"]

或者:

(2..10).map(&:to_s)
=> ["2", "3", "4", "5", "6", "7", "8", "9", "10"]

如果我需要兼容1.8和1.9+ Rubies,我可能会使用最后一种方法。

答案 2 :(得分:2)

这不是我得到的:

irb(main):001:0> ('2'..'10').to_a
=> ["2", "3", "4", "5", "6", "7", "8", "9", "10"]

与此问题无关:正确的方法是:

(2..10).to_a

(我使用的是Ruby 1.9.3)

答案 3 :(得分:1)

在ruby2.0.0-p-0中这就是我所得到的:

["2", "3", "4", "5", "6", "7", "8", "9", "10"]