Могу ли я написать сценарии ruby ​​2.3.7, которые обратно совместимы с 1.8.7? - PullRequest
0 голосов
/ 30 сентября 2019

До сих пор я писал все свои скрипты в оболочке POSIX, чтобы я мог запускать их на всех машинах, которые я использую (macOS, различные Linux, FreeBSD). Мне нравится иметь единый опыт, когда я могу вытащить свои файлы точек из git и иметь все свои настройки и сценарии, готовые к работе.

Однако оболочка POSIX - это действительно раздражающий язык, и я подумывалпереход на Ruby для моих нужд сценариев. К сожалению, еще до того, как я начал, я понял, что macOS поставляется с Ruby 2.3.7, и одна из машин, которые мне часто приходится использовать, имеет только Ruby 1.8.7. Это школьная машина, к которой у меня нет доступа sudo, поэтому я не могу установить более позднюю версию Ruby.

TL; DR

Возможно линаписать сценарии на Ruby, которые будут работать как на 1.8.7, так и на 2.3.7 (и, надеюсь, все между ними)? Существуют ли рекомендации, которым я могу следовать, чтобы избежать несовместимых языковых функций?

1 Ответ

1 голос
/ 30 сентября 2019

Да, это возможно, если вы ограничиваете себя пересечением языковых и библиотечных функций Ruby 1.8.7, Ruby 2.3.7 и всего, что между ними.

Последний большой прорыв назад-совместимостью стал переход с Ruby 1.8 на Ruby 1.9Обработка строк была полностью изменена, поэтому, чтобы что-то сделать с обработкой текста, вам нужно быть очень осторожным.

В верхней части моей головы:

  • В Ruby 1.8 считаются строкибыть последовательностью байтов. В Ruby 1.9. строки - это фабрика для разных итераторов, итерирующая в терминах кодовых точек, символов или байтов.
  • Поэтому в Ruby 1.9 строки больше не Enumerable.
  • Индексирование в строкувернет Integer в Ruby 1.8 и односимвольный String в Ruby 1.9.
  • Символьные литералы (например, ?a) приведут к Integer в Ruby 1.8 и односимвольномуString в Ruby 1.9.
  • В Ruby 1.8 предполагается, что все строки находятся в одной кодировке (обычно ASCII, но могут быть изменены на очень ограниченный набор, а именно UTF-8 и несколько азиатских пар). кодировок). Ruby 1.9 полностью поддерживает кодирование, каждая строка имеет свою собственную отдельную кодировку, каждый поток ввода-вывода имеет две кодировки (внутреннюю и внешнюю), и каждый исходный файл имеет отдельную кодировку.

Лучше всего ограничиться использованием только того, что указано в ISO Ruby Language Specification . Спецификация была специально написана так, чтобы все существующие на тот момент реализации Ruby (MRI, YARV, IronRuby, JRuby, MacRuby, Rubinius) автоматически соответствовали друг другу, что в основном означает, что спецификация указывает только минимально необходимое подмножество пересечения Ruby 1.8.6, Ruby 1.8.7 и Ruby 1.9.0.

Поскольку с тех пор не было никаких изменений, несовместимых с предыдущими версиями, вы можете быть уверены, что ваш код будет работать на всех версиях Ruby 1.8. От 6 до (но исключая) 3.0, и на всех ISO-совместимых реализациях Ruby, насколько я знаю, MRI, YARV, JRuby, IronRuby, Rubinius, MacRuby, MRuby, MagLev и TruffleRuby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...