Пустой диапазон между строками, представляющими числа

Вот два диапазона значений.

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

но,

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

Почему второй возвращает пустой массив в ruby ​​1.8.7?

4 ответа

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

Из-за алгоритма сравнения строк нельзя создать диапазон с нижней границей, превышающей верхнюю.

В действительности это работает в 1.9.3. Странный.

Проблема в том, что 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+.

Это не то, что я получаю:

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"]
Другие вопросы по тегам