Вийшов Ruby 4.0.0 preview3
Опублікував naruse 18-12-2025
Переклав: Andrii Furmanets
Раді повідомити про вихід Ruby 4.0.0-preview3. Ruby 4.0 вводить Ruby::Box і “ZJIT” та додає багато покращень.
Ruby::Box
Нова (експериментальна) функція для розділення визначень. Докладніше про “Ruby Box” див. doc/language/box.md. [Feature #21311] [Misc #21385]
Зміни мови
-
*nilбільше не викликаєnil.to_a, подібно до того, як**nilне викликаєnil.to_hash. [Feature #21047] -
Логічні бінарні оператори (
||,&&,andтаor) на початку рядка продовжують попередній рядок, як у fluent dot. Наступні два фрагменти коду рівнозначні:if condition1 && condition2 ... endif condition1 && condition2 ... end
Оновлення основних класів
Примітка: наведено лише помітні оновлення класів.
-
Kernel
-
Kernel#inspectтепер перевіряє наявність методу#instance_variables_to_inspect, що дозволяє керувати тим, які змінні екземпляра відображаються в рядку#inspect:class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
Застарілу поведінку створення процесу через
Kernel#openіз початковим|вилучено. [Feature #19630]
-
-
Binding
Binding#local_variablesбільше не містить нумерованих параметрів. ТакожBinding#local_variable_getіBinding#local_variable_setвідмовляються працювати з нумерованими параметрами. [Bug #21049]
-
File
File::Stat#birthtimeтепер доступний на Linux через системний виклик statx, коли його підтримують ядро та файлова система. [Feature #21205]
-
IO
-
IO.selectприймаєFloat::INFINITYяк аргумент тайм-ауту. [Feature #20610] -
Застарілу поведінку створення процесу методами класу
IOз початковим|вилучено. [Feature #19630]
-
-
Math
- Додано
Math.log1pтаMath.expm1. [Feature #21527]
- Додано
-
Method
Method#source_location,Proc#source_locationтаUnboundMethod#source_locationтепер повертають розширену інформацію про розташування з 5 елементів:[path, start_line, start_column, end_line, end_column]. Попередній формат з 2 елементів[path, line]все ще можна отримати, викликавши.take(2)у результаті. [Feature #6012]
-
Proc
Proc#parametersтепер показує анонімні необов’язкові параметри як[:opt]замість[:opt, nil], роблячи вивід узгодженим із випадком, коли анонімний параметр є обов’язковим. [Bug #20974]
-
Ractor
-
Додано клас
Ractor::Portяк новий механізм синхронізації для обміну між Ractor. [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Portнадає такі методи:Ractor::Port#receiveRactor::Port#send(абоRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
У результаті
Ractor.yieldіRactor#takeбули вилучені. -
Додано
Ractor#joinіRactor#valueдля очікування завершення Ractor. Це аналогічноThread#joinтаThread#value. -
Додано
Ractor#monitorіRactor#unmonitorяк низькорівневі інтерфейси, що використовуються всередині для реалізаціїRactor#join. -
Ractor.selectтепер приймає лише Ractor і Port. Якщо передано Ractor, він повертається, коли Ractor завершується. -
Додано
Ractor#default_port. КоженRactorмає порт за замовчуванням, який використовуєтьсяRactor.sendіRactor.receive. -
Ractor#close_incomingіRactor#close_outgoingбули вилучені. -
Запроваджено
Ractor.shareable_procіRactor.shareable_lambdaдля створення розділюваних Proc або lambda. [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_setтаEnumerator#to_setтепер виконують перевірки розміру, щоб запобігти проблемам з нескінченними діапазонами. [Bug #21654] -
Range#overlap?тепер коректно обробляє нескінченні (безмежні) діапазони. [Bug #21185] -
Виправлено поведінку
Range#maxдля безпочаткових цілих діапазонів. [Bug #21174] [Bug #21175]
-
-
Ruby
- Визначено новий глобальний модуль
Ruby, який містить константи, пов’язані з Ruby. Цей модуль був зарезервований у Ruby 3.4 і тепер офіційно визначений. [Feature #20884]
- Визначено новий глобальний модуль
-
Ruby::Box
- Нова (експериментальна) функція для розділення визначень. Докладніше про “Ruby Box” див. doc/language/box.md. [Feature #21311] [Misc #21385]
-
Set
-
Setтепер є основним класом, а не stdlib класом, що автозавантажується. [Feature #21216] -
Set#inspectтепер повертає рядок, придатний дляeval, використовуючи синтаксисSet[](наприклад,Set[1, 2, 3]замість#<Set: {1, 2, 3}>). Це робить його узгодженим з іншими основними колекційними класами, такими як Array і Hash. [Feature #21389] -
Передавання аргументів до
Set#to_setіEnumerable#to_setтепер застаріле. [Feature #21390]
-
-
Socket
Socket.tcpіTCPSocket.newприймають ключовий аргументopen_timeoutдля задання тайм-ауту початкового з’єднання. [Feature #21347]
-
String
-
Оновлено Unicode до версії 17.0.0 та Emoji до 17.0. [Feature #19908][Feature #20724][Feature #21275] (також стосується Regexp)
-
String#strip,strip!,lstrip,lstrip!,rstripіrstrip!розширено, щоб приймати аргументи*selectors. [Feature #21552]
-
-
Thread
- Додано підтримку аргументу
Thread#raise(cause:), подібно доKernel#raise. [Feature #21360]
- Додано підтримку аргументу
-
Fiber
- Додано підтримку аргументу
Fiber#raise(cause:), подібно доKernel#raise. [Feature #21360]
- Додано підтримку аргументу
-
Fiber::Scheduler
- Додано
Fiber::Scheduler#fiber_interruptдля переривання fiber заданим виключенням. Початковий сценарій використання - перервати fiber, що очікує блокувальну операцію IO, коли цю операцію IO закрито. [Feature #21166]
- Додано
-
Pathname
- Pathname переведено зі статусу default gem до основного класу Ruby. [Feature #17473]
Оновлення stdlib
Наступні bundled gems підвищено зі статусу default gems.
- ostruct 0.6.3
- pstore 0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 6.17.0
- win32ole 1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
Ми наводимо лише помітні зміни stdlib, що є змінами функціональності.
Інші зміни наведено в наступних розділах. Також ми навели історію релізів від попередньої bundled версії, якою є Ruby 3.3.0, якщо вона має релізи на GitHub.
Додано наступний default gem.
- win32-registry 0.1.2
Оновлено такі default gems.
- RubyGems 4.0.2
- bundler 4.0.2
- date 3.5.1
- digest 3.2.1
- english 0.8.1
- erb 6.0.1
- etc 1.4.6
- fcntl 1.3.0
- fileutils 1.8.0
- forwardable 1.4.0
- io-console 0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- prism 1.6.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- zlib 3.2.2
Оновлено такі bundled gems.
- minitest 5.27.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.3
- rexml 3.4.4
- net-ftp 0.3.9
- net-imap 0.6.1
- net-smtp 0.5.1
- matrix 0.4.3
- prime 0.1.4
- rbs 3.10.0.pre.2
- typeprof 0.31.0
- debug 1.11.0
- base64 0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- syslog 0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
Підтримувані платформи
-
Windows
- Припинено підтримку версій MSVC, старших за 14.0 (_MSC_VER 1900). Це означає, що тепер потрібен Visual Studio 2015 або новіший.
Проблеми сумісності
-
Через додавання
Ractor::Portвилучено такі методи Ractor:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoging
-
ObjectSpace._id2refє застарілим. [Feature #15408] -
Process::Status#&іProcess::Status#>>було вилучено. Вони були застарілими в Ruby 3.3. [Bug #19868] -
rb_path_checkбуло вилучено. Цю функцію використовували для перевірки шляхів$SAFE, яку прибрали в Ruby 2.7, і вона вже була застарілою. [Feature #20971]
Проблеми сумісності stdlib
-
Бібліотеку CGI вилучено з default gems. Тепер ми надаємо лише
cgi/escapeдля таких методів:CGI.escapeіCGI.unescapeCGI.escapeHTMLіCGI.unescapeHTMLCGI.escapeURIComponentіCGI.unescapeURIComponentCGI.escapeElementіCGI.unescapeElement
-
Після перенесення
Setзі stdlib до основного класу,set/sorted_set.rbбуло вилучено, аSortedSetбільше не є автозавантажуваною константою. Будь ласка, встановіть gemsorted_setіrequire 'sorted_set', щоб використовуватиSortedSet. [Feature #21287]
Оновлення C API
-
IO
rb_thread_fd_closeє застарілим і тепер не виконує дій. Якщо вам потрібно надати дескриптори файлів із C-розширень у код Ruby, створіть екземплярIO, використовуючиRUBY_IO_MODE_EXTERNAL, і використайтеrb_io_close(io), щоб закрити його (це також перериває та очікує завершення всіх операцій, що очікують, для екземпляраIO). Безпосереднє закриття дескрипторів файлів не перериває операції, що очікують, і може призвести до невизначеної поведінки. Іншими словами, якщо два об’єктиIOспільно використовують один і той самий дескриптор файлу, закриття одного не впливає на інший. [Feature #18455]
-
GVL
rb_thread_call_with_gvlтепер працює з GVL або без нього. Це дозволяє gem уникати перевіркиruby_thread_has_gvl_p. Будь ласка, все одно уважно ставтеся до GVL. [Feature #20750]
-
Set
-
Додано C API для
Set. Підтримуються такі методи: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
Покращення реалізації
Ractor
Проведено багато роботи, щоб зробити Ractor стабільнішими, продуктивнішими та зручнішими. Ці покращення наближають реалізацію Ractor до виходу з експериментального статусу.
- Покращення продуктивності
- Заморожені рядки та таблиця символів всередині використовують lock-free hash set
- Пошуки в кеші методів у більшості випадків обходяться без блокування
- Доступ до змінних екземпляра класів (та geniv) швидший і уникає блокувань
- Уникається конкуренція за кеш під час виділення об’єктів
object_idу більшості випадків обходиться без блокування
- Виправлення помилок і стабільність
- Виправлено можливі дедлоки при поєднанні Ractor і Thread
- Виправлено проблеми з require та autoload у Ractor
- Виправлено проблеми з кодуванням/транскодуванням між Ractor
- Виправлено умови гонки в операціях GC та інвалідизації методів
- Виправлено проблеми з форком процесів після запуску Ractor
JIT
- ZJIT
- Запроваджено експериментальний JIT-компілятор на основі методів.
Щоб увімкнути підтримку
--zjit, зберіть Ruby з Rust 1.85.0 або новішою. - Станом на Ruby 4.0.0, ZJIT швидший за інтерпретатор, але ще не такий швидкий, як YJIT. Ми заохочуємо експерименти з ZJIT, але радимо поки що не розгортати його в продакшені.
- Наша мета - зробити ZJIT швидшим за YJIT і готовим до продакшена в Ruby 4.1.
- Запроваджено експериментальний JIT-компілятор на основі методів.
Щоб увімкнути підтримку
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitбільше не працює у збірці за замовчуванням. Використайте--enable-yjit=statsуconfigure, щоб увімкнути її для--yjit-stats.- Додано
invalidate_everythingдо стандартної статистики; лічильник збільшується, коли весь код інвалідовується через TracePoint.
- Додано параметри
mem_size:таcall_threshold:доRubyVM::YJIT.enable.
- RJIT
--rjitвилучено. Ми перенесемо реалізацію стороннього JIT API до репозиторію ruby/rjit.
Інші зміни
Детальніше див. NEWS або журнали комітів для подробиць.
Унаслідок цих змін 3776 файлів змінено, 222800 вставок(+), 293617 видалень(-) з часу Ruby 3.4.0!
Завантаження
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz
SIZE: 23865890 SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0 SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz
SIZE: 17915004 SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99 SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6 SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip
SIZE: 29403010 SHA1: 689cb6c497afb96d26745708e772b63afca52e1a SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
Що таке Ruby
Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, і зараз вона розвивається як Open Source. Вона працює на багатьох платформах і використовується по всьому світу, особливо для веброзробки.
Останні новини
Вийшов Ruby 3.2.10
Вийшов Ruby 3.2.10.
Опублікував hsbt 14-01-2026
Вийшов Ruby 4.0.1
Вийшов Ruby 4.0.1.
Опублікував k0kubun 13-01-2026
Вийшов 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