В прошлом большом релизе Ruby под номером 3.1.0 появился новый компилятор и дебагер. А в этом релизе авторы работают над поддержкой WASI (The WebAssembly System Interface) и регулярными выражениями.
WebAssembly. Разработчики добавили первичную поддержку WebAssembly на основе WASI-интерфейса. Это позволит запускать бинарные CRuby-файлы в браузере, бессерверных средах и встроенных WebAssembly/WASI-системах. На данный момент порт проходит базовые и bootstrap-тесты, но не использует Thread API.
![](/upload/setka_images/11310004042022_3061805f11a5e052c8f9f8a728457f9fbf827c32.png)
Регулярные выражения. Добавили задержку (timeout) для Regexp-сравнений. Timeout позволяет задавать время, за которое Regexp-выражение должны проверить, иначе появляется ошибка. Это даст разработчикам возможность предотвращать ReDoS-атаки заранее.
Regexp.timeout = 1.0
/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
Улучшения в оптимизации. Изменили и пофиксили следующие типы данных:
Hash.
- Hash#shift теперь возвращает nil, если хеш пуст.
MatchData.
- Добавили MatchData#byteoffset.
Module.
- Добавили Module.used_refinements.
- Добавили Module#refinements.
- Добавили Module#const_added.
Proc.
- Proc#dup возвращает экземпляр подкласса.
- Proc#parameters теперь принимает лямбда-ключи.
Refinement.
- Добавили Refinement#refined_class.
Set.
- Set теперь доступен как builtin-класс.
String.
- Добавили String#byteindex и String#byterindex.
- Обновили версию Unicode до 14.0.0 и Emoji — до 14.0.
- Добавили String#bytesplice.
Struct.
- Struct-класс теперь можно инициализировать без keyword_init: true в Struct.new.
Что ещё? Убрали сторонние бандлеры — libyaml, libffi — и сделали функцию поиска паттернов для языков стабильной.
Подробнее прочитать обо всех изменениях можно на сайте Ruby, а протестировать новые функции — в TryRuby Playground.