这是两个范围值。
('1'..'10').to_a => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
但是,
('2'..'10').to_a => []
为什么第二个在ruby 1.8.7中返回一个空数组?
答案 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"]