1

这是两个范围值。

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

但,

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

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

4

4 回答 4

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 兼容,我可能会使用最后一种方法。

于 2013-03-27T15:04:50.860 回答
4
irb(main):001:0> '2' > '10'
=> true
irb(main):002:0> '1'>'10'
=> false

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

实际上它适用于1.9.3。奇怪的。

于 2013-03-27T12:31:09.233 回答
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)

于 2013-03-27T12:31:27.563 回答
1

在 ruby​​2.0.0-p-0 这就是我得到的:

["2", "3", "4", "5", "6", "7", "8", "9", "10"]
于 2013-03-27T12:45:42.953 回答