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/.
Want to help? Learn how to contribute to Fedora Docs ›