Вышел Ruby 4.0.0
Главное, что стоит знать обычному разработчику (Rails/скрипты/сервисы) — две крупные новинки и несколько изменений, которые реально могут всплыть при апгрейде.
1) Ruby Box (экспериментальная фича) Появился Ruby:Box — механизм изоляции «определений» внутри процесса: можно отделять monkey patch’и, изменения глобальных/классовых переменных, определения классов/модулей и даже подключённые нативные/рубишные библиотеки от других «коробок». Включается переменной окружения RUBY_BOX=1. В официальных примерах это предлагают использовать, например, чтобы тесты не ломали друг друга monkey patch’ами или чтобы крутить «blue-green» внутри одного Ruby-процесса.
2) ZJIT — новый JIT-компилятор (пока «поиграться», не «в прод») Ruby 4.0 приносит ZJIT — JIT нового поколения после YJIT. Его можно включить флагом —zjit (или через RubyVM::ZJIT.enable), но разработчики прямо пишут: ZJIT уже быстрее интерпретатора, однако пока не быстрее YJIT, поэтому сейчас это скорее поле для экспериментов и бенчмарков, чем кнопка «ускорить прод». Для сборки Ruby с поддержкой ZJIT нужен Rust версии 1.85+ (если вы собираете Ruby сами).
3) Пара изменений, которые могут неожиданно задеть код
- *nil больше не вызывает nil.to_a (как **nil не вызывает nil.to_hash). Если у вас были экзотические трюки с переопределением NilClass#to_a, это место стоит проверить.
- Логические операторы &&, ||, and, or в начале строки теперь считаются продолжением предыдущей строки (удобно для форматирования длинных условий «лесенкой»).
4) Обновления вокруг экосистемы (важно для реальных проектов)
- В Ruby 4.0 в комплекте идут RubyGems и Bundler версии 4 — это нормальная причина прогнать CI и проверить сборку/деплой, особенно если у вас строгие пайплайны или старые плагины.
- Есть и другие заметные обновления стандартных библиотек и «встроенных гемов» (например, обновления вокруг openssl, json и т.д.) — обычно это хорошо, но на проде лучше тестировать заранее.
Если коротко по стратегии обновления: для новых проектов — можно смело начинать на 4.0.0; для рабочих систем — сначала прогон тестов, сборки, деплоя и smoke-проверки, и только потом выкатывать (особенно если есть C-расширения или необычные зависимости).
Уже пробовали Ruby 4.0.0 — что кажется более перспективным для ваших задач: Ruby Box или ZJIT?
