Выпуск языка программирования Ruby 2.5.0
После года разработки состоялся релиз Ruby 2.5.0, динамического объектно-ориентированного языка программирования, отличающегося высокой эффективностью разработки программ и вобравшего в себя лучшие черты Perl, Java, Python, Smalltalk, Eiffel, Ada и Lisp. Код проекта распространяется под лицензиями BSD ("2-clause BSDL") и "Ruby", которая ссылается на последний вариант лицензии GPL и полностью совместима с GPLv3. Ruby 2.5 является пятым значительным выпуском, подготовленным в рамках планового процесса разработки, подразумевающего отведение года на подготовку функциональных улучшений и формирование каждые 2-3 месяца корректирующих выпусков.
- В блоках do/end теперь допустимо напрямую использовать секции rescue, else и ensure;
- Определен метод yield_self для выполнение операции yield с блоком в его контексте. В отличие от tap, метод возвращает результат выполнения блока;
- Поддержка измерения покрытия (coverage) тестовым кодом веток и методов. Покрытие ветки показывает то, какие ветки были выполнены в процессе выполнения тестов, а какие нет. Покрытие метода показывает какие методы были вызваны, а какие нет;
- Добавлены новые методы Hashslice и Hashtransform_keys;
- Конструктор Struct.new теперь может создавать классы, принимающие именованные аргументы (keyword arguments);
- Перечисляемые предикаты последовательностей (any?, all?, none? и one?) теперь могут принимать аргументы в виде шаблона;
- Прекращено использование констант верхнего уровня (top-level) с тем же именем, если поиск класса в указанной области видимости не увенчался успехом;
- Включена автоматическая загрузка библиотеки pp.rb без необходимости указания в коде 'require "pp"';
- Изменен на обратный порядок вывода трассировки (backtrace) и сообщения об ошибке(вначале идут вызовы, начиная со старых и заканчивая свежими, а в конце выводится сообщение об ошибке);
- На 5-10% увеличена производительность за счет удаления инструкций "trace" из байткода. При необходимости применения TracePoint теперь осуществляется динамическое изменение последовательностей инструкций (ISeqs). В итоге в обычных условиях, когда не используется TracePoint, устранены лишние накладные расходы, за счет их существенного повышения на этапе включения трассировки;
- Примерно в три раза ускорена передача блоков через параметры блока (например def foo(&b); bar(&b); end);
- IOwrite теперь может принимать несколько аргументов, компонуя выходные данные из нескольких буферов;
- Переписана реализация мьютексов. Размер rb_mutex_t уменьшен со 160 до 80 байт;
- ERB (Embedded RuBy) теперь генерирует код из шаблонов, который выполняется в два раза быстрее, по сравнению с Ruby 2.4;
- Увеличена производительность некоторых встроенных методов, включая Arrayconcat, Enumerablesort_by, Stringconcat, Stringindex и Time+;
- IO.copy_stream переведен на использование системного вызова copy_file_range, который позволяющий ускорить выполнение операций копирования данных из одного файла в другой файл с выполнением операции только на стороне ядра, без предварительного чтения данных в память процесса в пространстве пользователя;
- SecureRandom теперь использует предлагаемый операционной системой генератор псевдослучайных чисел (/dev/urandom) вместо OpenSSL;
- Библиотеки cmath, csv, date, dbm, etc, fcntl, fiddle, fileutils, gdbm, ipaddr, scanf, sdbm, stringio, strscan, webrick, zlib из стандартного набора библиотек переведены в категорию устанавливаемых по умолчанию gem-пакетов;
- Обновлены версии Onigmo 6.1.3, Psych 3.0.2, RubyGems 2.7.3 и RDoc 6.0.1;
- Добавлена поддержка спецификации Unicode 10.0.0;
- По умолчанию включена настройка Thread.report_on_exception, упрощающая отладку многопоточных программ.