Опубликовал naruse 23-11-2019
Перевел: shprotru
Мы рады сообщить о выпуске Ruby 2.7.0-preview3.
Предварительная версия выпущена, чтобы собрать обратную связь для окончательного выпуска запланировано на декабрь. Этот preview3 в основном выпущен для подтверждения совместимости ключевых аргументов.
В нём вводится ряд новшеств и улучшений производительности, наиболее значимые:
- Уплотнение GC
- Сопоставление с образцом
- Улучшение REPL
- Разделение позиционных и ключевых аргументов
Уплотнение GC
Этот выпуск содержит новшество - уплотнение GC, который позволяет дефрагментировать фрагментированную память.
В некоторых многопоточных Ruby-программах может возникать фрагментация памяти, что приводит к чрезмерному потреблению памяти и снижению производительности.
Метод GC.compact
вводится для уплотнения хипа. Эта функция сжимает живые
объекты в хипе, чтобы уменьшить количество использованных страниц памяти,
и хип может оказаться более подходящим для CoW.
[Feature #15626]
Сопоставление с образцом [Экспериментальное]
Сопоставление с образцом, широко используемое в функциональных языках программирования, представлено в качестве экспериментального нововведения. [Feature #14912]
Оно позволяет пересекать с указанным объектом и присваивать ему значение, если оно соответствует шаблону.
require "json"
json = <<END
{
"name": "Alice",
"age": 30,
"children": [{ "name": "Bob", "age": 2 }]
}
END
case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
p age #=> 2
end
Подробнее, смотрите Сопоставление с образцом - новая особенность Ruby 2.7.
Улучшение REPL
irb
, включаемая интерактивная оболочка (REPL; Read-Eval-Print-Loop),
теперь поддерживает многострочное редактирование. Оно работает на reline
,
совместимой с readline
но реализованной на Ruby.
Обеспечена интеграция rdoc. Теперь в irb
можно отобразить ссылку
на указанный класс, модуль или метод.
[Feature #14683],
[Feature #14787],
[Feature #14918]
Кроме того, строки исходников в binding.irb
и результаты инспектирования
для базовых классов теперь подсвечиваются.
Разделение позиционных и ключевых аргументов
Автоматическая конверсия ключевых аргументов и позиционных аргументов устарели, и эти преобразования будут удалены в Ruby 3. [Feature #14183]
-
Когда вызов метода передает Хэш в последнем аргументе, и когда он не передает ключевые слова, и когда вызываемый метод принимает ключевые слова, выдается предупреждение. Чтобы продолжить обработку ключевых слов, добавьте оператор двойную звёздочку для избежания предупреждения и обеспечения правильного поведения в Ruby 3.
def foo(key: 42); end; foo({key: 42}) # warned def foo(**kw); end; foo({key: 42}) # warned 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) # warned def foo(h, key: 42); end; foo(key: 42) # warned def foo(h, **kw); end; foo({key: 42}) # OK def foo(h, key: 42); end; foo({key: 42}) # OK
-
Когда метод принимает определенные ключевые слова, но не ключевое слово звёздочку, и хэш или ключевые слова звёздочки передаются в метод, который включает в себя и Символьные и Несимвольные ключи, хэш продолжать разделяться, и будет предупреждение. Нужно обновить вызывающий код чтобы передать отдельные хэши, для обеспечения правильного поведения в Ruby 3.
def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
-
Если метод не принимает ключевые слова и вызывается с ключевыми словами, ключевые слова по-прежнему обрабатываются как позиционный хэш, без предупреждений. Такое поведение сохранится в Ruby 3.
def foo(opt={}); end; foo( key: 42 ) # OK
-
НеСимволы допускаются в качестве ключевых слов аргументов ключей, если метод принимает произвольные ключевые слова. [Feature #14183]
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
-
**nil
допускается в определениях методов явно отмечать что метод не принимает никаких ключевых слов. Вызов такого метода с ключевыми словами приведет к возникновнию ArgumentError. [Feature #14183]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
-
Передача пустого ключевого слова звёздочки методу, который больше не принимает ключевые слова не передает пустой хэш, если пустой хэш не является необходимым для обязательного параметра, в этом случае будет выдано предупреждение. Удалите двойную звёздочку для продолжения передачи позиционного хэша. [Feature #14183]
h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}
ПРИМЕЧАНИЕ: Выводилось слишком много устаревших предупреждений о несовместимости аргументов ключевых слов, слишком многословны. В настоящее время обсуждаются два решения; отключение устаревших предупреждений по умолчанию (#16345) или подавление задублированных предупреждений (#16289). Окончательное решение пока не принято, но будет зафиксировано в официальным релизе.
Другие Значимые Новые Функции
-
Оператор ссылки на метод,
.:
, вводился в качестве экспериментальной функции в ранних выпусках, но был отклонён [Feature #12125], [Feature #13581], [Feature #16275] -
Нумерованный параметр в качестве параметра блока по умолчанию представлен в качестве экспериментальной функции. [Feature #4475]
-
Вводится экспериментальный безначальный диапазон. Это может не так полезно, как бесконечный диапазон, но может пригодиться для DSL. [Feature #14799]
ary[..3] # identical to ary[0..3] rel.where(sales: ..100)
-
Enumerable#tally
добавлен. Подсчитывает вхождение каждого элемента.["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1}
-
Вызов приватного метода по
self
теперь возможен. [Feature #11297], [Feature #16123]def foo end private :foo self.foo
-
Enumerator::Lazy#eager
добавлен. Генерирует не ленивый перечислитель из ленивого перечислителя. [Feature #15901]a = %w(foo bar baz) e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager p e.class #=> Enumerator p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
Улучшения производительности
-
JIT [Экспериментальный]
-
JITed-код пересобирается с меньшей оптимизацией, когда предположение об оптимизации становится недействительным.
-
Встраиваемые методы выполняются, когда метод считается чистым. Эта оптимизация все еще экспериментальна, и многие методы еще НЕ считаются чистыми.
-
Значение по умолчанию для
--jit-min-calls
изменено с 5 до 10,000 -
Значение по умолчанию для
--jit-max-cache
изменено 1,000 до 100.
-
-
(отменено),Symbol#to_s
Module#name
,true.to_s
,false.to_s
, иnil.to_s
теперь всегда возвращают морозную строку. Возвращенная строка всегда одинакова для данного объекта. [Экспериментальный] [Feature #16150] -
Производительность
CGI.escapeHTML
улучшена. GH-2226 -
Производительность Monitor и MonitorMixin улучшена. [Feature #16255]
Другие заметные изменения с 2.6
- Обновлены некоторые стандартные библиотеки.
- stdlib переместили в default gems
- Следующие default gems были опубликованы на rubygems.org
- benchmark
- cgi
- delegate
- getoptlong
- net-pop
- net-smtp
- open3
- pstore
- singleton
- Следующие default gems были только объявлены в ruby-core,
но не были опубликованы на rubygems.org.
- monitor
- observer
- timeout
- tracer
- uri
- yaml
- Следующие default gems были опубликованы на rubygems.org
-
Если
Proc.new
иproc
без блока в методе, вызванным с блоком, выведется предупреждение. -
lambda
без блока в методе вызывается с ошибками блока. -
Обновлены версии Unicode и Emoji с 11.0.0 до 12.0.0. [Feature #15321]
-
Обновлена версия Unicode до 12.1.0, с поддержкой нового глифа U+32FF SQUARE ERA NAME REIWA. [Feature #15195]
-
Date.jisx0301
,Date#jisx0301
, иDate.parse
поддерживают новую Японскую эру. [Feature #15742] - Требование к компиляторам поддерживать C99
[Misc #15347]
- Подробнее о нашем диалекте: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99
отмененоRegexp#match{?}
сnil
приводит к TypeError as String, Symbol. [Feature #13083]
3895 файлов изменено, 213426 вставок(+), 96934 удалений(-)
Смотрите НОВОСТИ или историю коммитов для подробностей об изменениях.
В этих изменениях, статистика с Ruby 2.6.0!
Получайте удовольствие от программирования с Ruby 2.7!
Скачать
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.bz2
SIZE: 14630824 SHA1: 1fa35d8a26dfc814e92fa259095f4cf70f386f87 SHA256: df2ddee659873e6fc30a8590ecffa49cf3a4ef81fa922b0d09f821b69ee88bc3 SHA512: 5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.gz
SIZE: 16723536 SHA1: 7554926ee29a344da4b53d67fc296d70fdbe60ca SHA256: 9baa1f5096ebc2a0923df628d7dc7105da3789c1bf8b873469d9010249736b00 SHA512: 8fad3e761fd54036fee974a9f33e4db31d9a8a878b1181a08724388f5a1da548ab249136356f675797e9c43b565777bf22e6a419db1364336f134b31f4e75b33
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.xz
SIZE: 11923988 SHA1: f3c54538915483e5ddc714ac23414e7c47048b12 SHA256: ad9d61e55ac224e3447a762e001965839846f9658f87a0e792840887cfe61b8c SHA512: 2b6844f34d32f1013dc3110043e6ece33a083b20f1343dea9a14311bda0017e8f56fc7d73be1616999b22ce430d7ba59a77bb0892d27c6d1ec243c3860086133
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.zip
SIZE: 20691541 SHA1: d18b494cda4db751d8b3f5026404e348f3f682e3 SHA256: 2bc95f67f271b6a41fc3dd40536705b4a7974df8a2fa33ff0758a60822291781 SHA512: af9f728aebc53693cbd9f78a632c82e851e9f83dfc0c53979fdc37c627b11482c8435ce12dbb1d5a7253e998ea989759be699e6a00aae18384d2d765650cb0d7
Что такое Ruby
Изначально Ruby был разработан Matz (Yukihiro Matsumoto) в 1993 году, и в настоящее время разрабатывается как Open Source. Он работает на множестве платформ и используется во всем мире, особенно для веб-разработки.