Documentation for a newer release is available. View Latest

Ruby

Ruby 2.7

Fedora 32 предоставляет версию Ruby 2.7. С этим крупным обновлением с Ruby 2.6 Fedora становится превосходной платформой разработки на Ruby.

Изменения по сравнению с Ruby 2.6:

Ruby 2.7 поставляется с несколькими новыми функциями и улучшениями производительности.

Улучшения производительности

  • JIT [Экспериментально]

  • Стратегия кэширования Fiber изменена, ускорено создание волокон.

  • Module#name, true.to_s, false.to_s и nil.to_s теперь всегда возвращают замороженную строку. Возвращаемая строка всегда одна и та же для данного объекта. [Экспериментально]

  • Улучшена производительность Monitor и MonitorMixin.

  • Улучшена производительность CGI.escapeHTML.

  • Кэш методов Per-call-site, существующий примерно с версии 1.9, был улучшен: попаданий в кэш увеличилось с 89% до 94%.

  • Метод RubyVM::InstructionSequence#to_binary генерирует скомпилированный двоичный код. Размер двоичного файла уменьшен.

Другие заметные изменения

  • Некоторые стандартные библиотеки обновлены.

    • Bundler 2.1.2

    • RubyGems 3.1.2

    • Racc 1.4.15

    • CSV 3.1.2

    • REXML 3.2.3

    • RSS 0.2.8

    • StringScanner 1.0.3

    • Некоторые другие библиотеки, не имеющие оригинальной версии, также обновлены.

  • Следующие библиотеки больше не являются встроенными гемами. Установите соответствующие гемы для использования этих функций.

    • CMath (гем cmath)

    • Scanf (гем scanf)

    • Shell (гем shell)

    • Synchronizer (гем sync)

    • ThreadsWait (гем thwait)

    • E2MM (гем e2mmap)

  • profile.rb был удалён из стандартной библиотеки.

  • Повышение stdlib до стандартных гемов

    • Следующие стандартные гемы были опубликованы на rubygems.org

      • benchmark

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • Следующие стандартные гемы были повышены только в ruby-core, но ещё не опубликованы на rubygems.org.

      • monitor

      • observer

      • timeout

      • tracer

      • uri

      • yaml

  • Proc.new и proc без блока в методе, вызванном с блоком, теперь вызывают предупреждение.

  • lambda без блока в методе, вызванном с блоком, вызывает исключение.

  • Обновление версии Unicode и версии Emoji с 11.0.0 до 12.0.0.

  • Обновление версии Unicode до 12.1.0 с добавлением поддержки U+32FF SQUARE ERA NAME REIWA.

  • Date.jisx0301, Date#jisx0301 и Date.parse поддерживают новую японскую эру.

  • Требование поддержки C99 компиляторами.

Подробные изменения

Сопоставление с образцом [Экспериментально]

Сопоставление с образцом, широко используемая функция в функциональных языках программирования, вводится как экспериментальная функция. Она позволяет обходить заданный объект и присваивать его значение, если оно соответствует образцу.

require "json"

json = <<END
{
  "name": "Алиса",
  "age": 30,
  "children": [{ "name": "Боб", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Алиса", children: [{name: "Боб", age: age}]}
  p age #=> 2
end

Улучшение REPL

irb, встроенная интерактивная среда (REPL; Read-Eval-Print-Loop), теперь поддерживает многострочное редактирование. Она работает на основе reline — библиотеки, совместимой с readline, реализованной на чистом Ruby. Она также обеспечивает интеграцию с rdoc. В irb вы можете отображать справку для заданного класса, модуля или метода.

Сборщик мусора с уплотнением

Этот выпуск представляет Compaction GC, который может дефрагментировать фрагментированное пространство памяти.

Некоторые многопоточные программы на Ruby могут вызывать фрагментацию памяти, приводящую к высокому использованию памяти и снижению скорости.

Метод GC.compact вводится для уплотнения кучи. Эта функция уплотняет живые объекты в куче, чтобы использовалось меньше страниц, и куча могла быть более дружественной к CoW (копированию при записи).

Разделение позиционных и именованных аргументов

Автоматическое преобразование именованных и позиционных аргументов объявлено устаревшим, и преобразование будет удалено в Ruby 3.

Изменения
  • Когда при вызове метода в качестве последнего аргумента передаётся Hash, когда не передаётся ни одного именованного аргумента и когда вызываемый метод принимает именованные аргументы, выдаётся предупреждение. Чтобы продолжать обрабатывать хеш как именованные аргументы, добавьте оператор двойной звёздочки, чтобы избежать предупреждения и обеспечить корректное поведение в Ruby 3.

        def foo(key: 42); end; foo({key: 42})   # предупреждение
        def foo(**kw);    end; foo({key: 42})   # предупреждение
        def foo(key: 42); end; foo(**{key: 42}) # OK
        def foo(**kw);    end; foo(**{key: 42}) # OK
  • Когда при вызове метода передаются именованные аргументы методу, который их принимает, но не передаётся достаточно обязательных позиционных аргументов, именованные аргументы рассматриваются как последний обязательный позиционный аргумент, и выдаётся предупреждение. Передавайте аргумент как хеш вместо именованных аргументов, чтобы избежать предупреждения и обеспечить корректное поведение в Ruby 3.

        def foo(h, **kw); end; foo(key: 42)      # предупреждение
        def foo(h, key: 42); end; foo(key: 42)   # предупреждение
        def foo(h, **kw); end; foo({key: 42})    # OK
        def foo(h, key: 42); end; foo({key: 42}) # OK
  • Когда метод принимает конкретные именованные аргументы, но не принимает распаковку именованных аргументов, и в метод передаётся хеш или распаковка именованных аргументов, содержащая как Symbol, так и не-Symbol ключи, хеш будет продолжать разделяться, и будет выдано предупреждение. Вам потребуется обновить вызывающий код для передачи отдельных хешей, чтобы обеспечить корректное поведение в Ruby 3.

        def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # предупреждение
        def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # предупреждение
        def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
  • Если метод не принимает именованные аргументы и вызывается с именованными аргументами, именованные аргументы по-прежнему обрабатываются как позиционный хеш без предупреждения. Это поведение продолжит работать в Ruby 3.

        def foo(opt={});  end; foo( key: 42 )   # OK
  • Не-Symbol объекты разрешены в качестве ключей именованных аргументов, если метод принимает произвольные именованные аргументы.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • **nil разрешён в определениях методов для явного указания того, что метод не принимает именованные аргументы. Вызов такого метода с именованными аргументами приведёт к ArgumentError.

        def foo(h, **nil); end; foo(key: 1)       # ArgumentError
        def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
        def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
        def foo(h, **nil); end; foo({key: 1})     # OK
        def foo(h, **nil); end; foo({"str" => 1}) # OK
  • Передача пустой распаковки именованных аргументов методу, который не принимает именованные аргументы, больше не передаёт пустой хеш, если только пустой хеш не требуется для обязательного параметра, в этом случае будет выдано предупреждение. Удалите двойную звёздочку, чтобы продолжать передавать позиционный хеш.

        h = {}; def foo(*a) a end; foo(**h) # []
        h = {}; def foo(a) a end; foo(**h)  # {} и предупреждение
        h = {}; def foo(*a) a end; foo(h)   # [{}]
        h = {}; def foo(a) a end; foo(h)    # {}

Если вы хотите отключить предупреждения об устаревании, используйте аргумент командной строки -W:no-deprecated или добавьте Warning[:deprecated] = false в свой код.

Более подробную информацию об этом выпуске см. в объявлении о выпуске вышестоящего проекта.

Jekyll 4.0

Генератор статических страниц Jekyll и его плагины обновлены до версии 4.0.0. Эта версия включает следующие изменения по сравнению с версией 3.8:

  • Значительные улучшения производительности

  • Очистка и исправление ошибок

  • Другие незначительные изменения, несовместимые с предыдущим выпуском

Для получения дополнительной информации о Jekyll 4.0.0 см. https://jekyllrb.com/news/2019/08/20/jekyll-4-0-0-released/.