Пустой диапазон между строками, представляющими числа
Вот два диапазона значений.
('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"]