这是两个范围值。
('1'..'10').to_a => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
但,
('2'..'10').to_a => []
为什么第二个在 ruby 1.8.7 中返回一个空数组?
问题是 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 兼容,我可能会使用最后一种方法。
irb(main):001:0> '2' > '10'
=> true
irb(main):002:0> '1'>'10'
=> false
由于字符串比较算法,无法创建下限大于上限的范围。
实际上它适用于1.9.3。奇怪的。
这不是我得到的:
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)
在 ruby2.0.0-p-0 这就是我得到的:
["2", "3", "4", "5", "6", "7", "8", "9", "10"]