Вийшов Ruby 2.7.0-rc1
Опублікував naruse 17-12-2019
Переклав: Andrii Furmanets
Ми раді оголосити випуск Ruby 2.7.0-rc1.
Release candidate випущено для збору відгуків для фінального випуску, запланованого на грудень. Цей rc1 в основному випущено для підтвердження сумісності ключових аргументів.
Він також вводить ряд нових функцій та покращень продуктивності, найбільш помітні:
- Compaction GC
- Pattern Matching
- Покращення REPL
- Розділення позиційних та ключових аргументів
Compaction GC
Цей випуск вводить Compaction GC, який може дефрагментувати фрагментований простір пам’яті.
Деякі багатопотокові програми Ruby можуть спричинити фрагментацію пам’яті, що призводить до високого використання пам’яті та погіршення швидкості.
Метод GC.compact введено для компактування купи.
Ця функція компактує живі об’єкти в купі, щоб використовувалося менше сторінок,
та купа може бути більш CoW дружньою.
[Функція #15626]
Pattern Matching [Експериментально]
Pattern matching, широко використовувана функція в функціональних мовах програмування, введена як експериментальна функція. [Функція #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
Для більше деталей, будь ласка, див. Pattern matching - Нова функція в Ruby 2.7.
Покращення REPL
irb, включене інтерактивне середовище (REPL; Read-Eval-Print-Loop),
тепер підтримує багаторядкове редагування. Воно працює завдяки reline,
сумісній з readline реалізації на чистому Ruby.
Воно також надає інтеграцію rdoc. В irb ви можете відобразити довідку
для заданого класу, модуля або методу.
[Функція #14683],
[Функція #14787],
[Функція #14918]
Крім того, рядки джерела, показані в binding.irb, та результати inspect
для об’єктів core-класів тепер кольорові.
Розділення позиційних та ключових аргументів
Автоматичне перетворення ключових аргументів та позиційних аргументів застаріло, і перетворення буде видалено в Ruby 3. [Функція #14183]
-
Коли виклик методу передає Hash як останній аргумент, і коли він не передає ключові слова, і коли викликаний метод приймає ключові слова, випускається попередження. Щоб продовжити обробляти hash як ключові слова, додайте подвійний оператор splat, щоб уникнути попередження та забезпечити правильну поведінку в 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 -
Коли виклик методу передає ключові слова до методу, який приймає ключові слова, але він не передає достатньо обов’язкових позиційних аргументів, ключові слова обробляються як останній обов’язковий позиційний аргумент, і випускається попередження. Передайте аргумент як hash замість ключових слів, щоб уникнути попередження та забезпечити правильну поведінку в 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 -
Коли метод приймає специфічні ключові слова, але не приймає splat ключових слів, і hash або splat ключових слів передається до методу, який включає як Symbol, так і не-Symbol ключі, hash продовжує бути розділеним, і випускається попередження. Вам потрібно буде оновити код виклику, щоб передати окремі hash, щоб забезпечити правильну поведінку в 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 -
Якщо метод не приймає ключові слова, і викликається з ключовими словами, ключові слова все ще обробляються як позиційний hash, без попередження. Ця поведінка продовжуватиме працювати в Ruby 3.
def foo(opt={}); end; foo( key: 42 ) # OK -
Не-символи дозволені як ключі ключових аргументів, якщо метод приймає довільні ключові слова. [Функція #14183]
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1} -
**nilдозволено у визначеннях методів, щоб явно позначити, що метод не приймає ключові слова. Виклик такого методу з ключовими словами призведе до ArgumentError. [Функція #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 -
Передача порожнього splat ключових слів до методу, який не приймає ключові слова, більше не передає порожній hash, якщо порожній hash не потрібен для обов’язкового параметра, в такому випадку випускається попередження. Видаліть подвійний splat, щоб продовжити передавати позиційний hash. [Функція #14183]
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) # {}
ПРИМІТКА: Занадто багато попереджень про застарілість про несумісність ключових аргументів було вказано як занадто багатослівні. Зараз обговорюються два можливі рішення; вимкнення попереджень про застарілість за замовчуванням (#16345) або придушення дубльованих попереджень (#16289). Фінальне рішення не прийнято, але буде виправлено офіційним випуском.
Інші помітні нові функції
-
Оператор посилання на метод,
.:, був введений як експериментальна функція в попередніх preview, але був відкочений назад. [Функція #12125], [Функція #13581], [Функція #16275] -
Нумерований параметр як параметр блоку за замовчуванням введено як експериментальну функцію. [Функція #4475]
-
Безпочатковий діапазон експериментально введено. Він може бути не таким корисним як нескінченний діапазон, але буде хорошим для цілей DSL. [Функція #14799]
ary[..3] # ідентично до ary[0..3] rel.where(sales: ..100) -
Enumerable#tallyдодано. Він підраховує появу кожного елемента.["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1} -
Виклик приватного методу на
selfтепер дозволено. [Функція #11297], [Функція #16123]def foo end private :foo self.foo -
Enumerator::Lazy#eagerдодано. Він генерує не-lazy enumerator з lazy enumerator. [Функція #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 [Експериментально]
-
JIT-компільований код перекомпілюється до менш оптимізованого коду, коли припущення оптимізації стає недійсним.
-
Інлайнінг методів виконується, коли метод вважається чистим. Ця оптимізація все ще експериментальна, і багато методів ще НЕ вважаються чистими.
-
Значення за замовчуванням
--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тепер завжди повертають заморожений String. Повернутий String завжди той самий для заданого об’єкта. [Експериментально] [Функція #16150] -
Продуктивність
CGI.escapeHTMLпокращено. GH-2226 -
Продуктивність Monitor та MonitorMixin покращено. [Функція #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. [Функція #15321]
-
Оновлено версію Unicode до 12.1.0, додаючи підтримку для U+32FF SQUARE ERA NAME REIWA. [Функція #15195]
-
Date.jisx0301,Date#jisx0301, таDate.parseпідтримують нову японську еру. [Функція #15742] - Вимагаємо підтримки C99 компіляторами
[Misc #15347]
- Деталі нашого діалекту: https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99
відкочено назадRegexp#match{?}зnilпіднімає TypeError як String, Symbol. [Функція #13083]
Див. NEWS або логи комітів для більше деталей.
З цими змінами, 4163 файлів змінено, 226280 додано(+), 99449 видалено(-) з Ruby 2.6.0! Насолоджуйтеся програмуванням з Ruby 2.7!
Завантаження
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.bz2
РОЗМІР: 14691356 SHA1: f501841276c4a922104b4afb19ff385a6de6b2e0 SHA256: 1c5a02b63fa9fca37c41681bbbf20c55818a32315958c0a6c8f505943bfcb2d2 SHA512: b5f96227775f8bdf19f944a555d0a83d7e84b37bd31fe4b8ac008a3272b1a28a4d94abbb1b5570ee32ec0690ba9d476b837a020a5194bee14bebf6f0e768bc79 -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.gz
РОЗМІР: 16772802 SHA1: c45cb603ed845d1e0d458d3fdc1afc910b6945b4 SHA256: 59bd97b82e167453b5c76bc0fbb50ebda15ccee56b9ef1e94d5530b095b8a392 SHA512: 6710266d221e9fd0ac9d6c40d48ce502badbc8b87ef500bb428b63e1744497903be267860dbc93a78235ef959ae3326f7e3c597b5567df87648fccb216d56f7d -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.xz
РОЗМІР: 11987512 SHA1: 7d57c78a1c05e4d03d9f6726512f2c31d74413d8 SHA256: 7528db87df7a8cbfdcbd053073839f5a00b2a38f807771e3e45000e72fc86732 SHA512: 202b1a5bf01e6c398b8745cf968027db507ef39df521b3b24e06c6894d507ffcef9e904fa0d3a47f8be98fe750ca15a9829eb75627dacb4679538a61dabbe368 -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.zip
РОЗМІР: 20645360 SHA1: 3f0c415b8c2c674c9d4a86cce48347b15f822de8 SHA256: f0c73add73c84a0390dca858c8c24e0cab107ada7dea7193e1ae207f78b79193 SHA512: 23db300274f8a60aa89b3ab4a1685fba527b62c66b6944f03fdb4c32418e65aae3adc909c7c7c8dae743def230dadbf19ec3be6de50a9e955a0049b5c26e4020
Що таке Ruby
Ruby вперше розроблено Matz (Yukihiro Matsumoto) у 1993 році, і зараз розробляється як Open Source. Він працює на кількох платформах та використовується по всьому світу, особливо для веб-розробки.
Останні новини
Вийшов Ruby 4.0.0
Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.
Опублікував naruse 25-12-2025
Новий вигляд документації Ruby
Слідом за ре-дизайном ruby-lang.org, ми маємо більше новин, щоб відсвяткувати 30-річчя Ruby: docs.ruby-lang.org має повністю новий вигляд завдяки Aliki — новій темі за замовчуванням для...
Опублікував Stan Lo 23-12-2025
Оновлення айдентики нашого сайту
Раді оголосити про комплексне оновлення нашого сайту. Дизайн для цього оновлення створила Taeko Akatsuka.
Опублікував Hiroshi SHIBATA 22-12-2025
Вийшов Ruby 4.0.0 preview3
Раді повідомити про вихід Ruby 4.0.0-preview3. Ruby 4.0 вводить Ruby::Box і “ZJIT” та додає багато покращень.
Опублікував naruse 18-12-2025