Представлен релиз Ruby 2.3, динамического объектно-ориентированного языка программирования, отличающегося высокой эффективностью разработки программ и вобравшего в себя лучшие черты Perl, Java, Python, Smalltalk, Eiffel, Ada и Lisp. Код проекта распространяется под лицензиями BSD («2-clause BSDL») и «Ruby», которая ссылается на последний вариант лицензии GPL и полностью совместима с GPLv3. Ruby 2.3 является третьим значительным выпуском, подготовленным в рамках нового планового процесса разработки, подразумевающего отведение года на подготовку функциональных улучшений и формирование каждые 2-3 месяца корректирующих выпусков. В скором времени ожидается выпуск фреймворка Rails 5.0, первая бета-версия которого вышла неделю назад.
Основные улучшения:
- Реализована новая экспериментальная прагма frozen-string-literal, а также связанная с ней опций «—enable/—disable=frozen-string-literal», позволяющие заморозить состояние строковых литералов в исходных текстах. Также добавлен новый отладочный режим «—debug=frozen-string-literal» при котором будет показано где именно изменение объекта приводит к выводу ошибки «can’t modify frozen String»;
- Добавлен новый оператор «.» для упрощение обработки значений nil при обращении к объектам, реализованный по мотивам операторов безопасной навигации C#, Groovy и Swift. При использовании синтаксиса вызова методов obj.foo, метод #foo будет вызван только если object не является nil. Оператор ведёт себя как выражение «try!» (obj.try! {}) из ActiveSupport, но обрабатывает только значения nil. Для массивов, хэшей и структур добавлены операторы Array#dig, Hash#dig и Struct
- Для упрощения отладки в базовый состав добавлен gem «did_you_mean«, предлагающий правки для типичных опечаток при выводе ошибок NameError и NoMethodError;
"Yuki".starts_with?("Y") # = NoMethodError: undefined method `starts_with?' for "Yuki":String # Did you mean? start_with?
- Добавлены экспериментальные возможности для обработки предкомпилированного байткода в формате ISeq. Для сериализации кода реализован объект
RubyVM::InstructionSequence#to_binary_format, а для десериализации и загрузки байткода — RubyVM::InstructionSequence.load_from_binary(binary); - В String.new добавлена поддержка указания параметра «encoding» для определения кодировки;
- Проведена серия оптимизаций производительности. В том числе реализован новый метод хранения табличных структур, оптимизирована работа Proc#call, на уровне машинного кода проведён тюнинг размещения объектов и вызова методов, добавлена возможность использования ключевых слов «exception:» для организации неблокирующего ввода/вывода;
- Прекращена поддержка платформ OS/2, BeOS и Borland-C. Уровень поддержки платформы Haiku доведён до стабильного.