Я довольно новичок в рубине.Недавно я хотел извлечь часть строки из n-го символа указанной строки до конца.
Делать что-то вроде s [n, (s.size - n)] мне показалось довольно не элегантным, поэтому я спросил пару друзей.
Один из них предложил мне попробовать s [n ..- 1], и, конечно же, это работает, но он не мог дать мне вескую причину, почему это должно работать.Я нахожу тот факт, что он работает довольно загадочно, поскольку следующий вывод из irb1.9 должен объяснить:
> s = "0123456789"
=> "0123456789"
> s[2..-1]
=> "23456789"
> (2..-1).to_a
=> []
Итак, как вы можете видеть, объект диапазона 2 ..- 1 пуст - он имеетнет членов, что абсолютно то, что вы ожидаете, если вы идете вверх в значении от 2 до -1.Это согласуется с документацией о том, как должны работать объекты диапазона.
Документация для индексации строки с диапазоном четко гласит: «Если задан диапазон, возвращается подстрока, содержащая символы со смещениями, заданными диапазоном»- но это пустой набор.
Я также не могу найти примеров в "Языке программирования Ruby" или в документах Ruby, в которых строка индексируется с использованием s[n..-1]
или подобного, и могу найтинет примеров в других официальных источниках.Однако это похоже на фольклор, что он работает, хотя ничто в руководствах не указывает на то, что вы можете индексировать строку с диапазоном таким образом, и получать полученный результат, даже если у диапазона нет членов.
Тем не менее, мой друг был прав, это работает.
Итак, кто-то может объяснить, пожалуйста , почему это работает для меня?Мне также очень интересно узнать, является ли тот факт, что это работает, случайностью MRI / YARV, или это абсолютно обязательно будет работать во всех реализациях Ruby, и если да, то где это задокументировано для работы?
EDITED TO ADD:
Ответчик ниже утверждал, что для этих целей имеют значение только атрибуты диапазона begin
и end
, но я не могу найти документацию об этом в TRPL или в документации Ruby.В ответе также утверждается, что действительно есть примеры такой индексации диапазона со «смешанным знаком», но единственный, что я смог найти, был в контексте, где было показано, что индекс со смешанным диапазоном производит nil
, а не фрагмент строки,Поэтому я не нахожу этот ответ удовлетворительным.
РЕДАКТИРОВАНИЕ ДОБАВИТЬ:
Похоже, правильный ответ заключается в том, что это действительно дефект в документации по Ruby.
ИЗМЕНЕНО В ДОБАВЛЕНИЕ:
Ошибка была исправлена командой документации Ruby: см. https://bugs.ruby -lang.org / Issues / 6106