Вийшов Ruby 3.0.0 Preview 1
Опублікував naruse 25-09-2020
Переклав: Andrii Furmanets
Ми раді оголосити випуск Ruby 3.0.0-preview1.
Він вводить ряд нових функцій та покращень продуктивності.
RBS
RBS - це мова для опису типів програм Ruby. Перевірки типів, включаючи type-profiler та інші інструменти, що підтримують RBS, зрозуміють програми Ruby набагато краще з визначеннями RBS.
Ви можете записати визначення класів та модулів: методи, визначені в класі, змінні екземпляра та їх типи, та відносини наслідування/міксину. Мета RBS - підтримувати загальні патерни в програмах Ruby, і він дозволяє писати розширені типи, включаючи об’єднані типи, перевантаження методів та дженерики. Він також підтримує duck typing з типами інтерфейсів.
Ruby 3.0 постачається з gem rbs, який дозволяє парсити та обробляти визначення типів, написані в RBS.
Наступний приклад - невеликий приклад RBS.
module ChatApp
VERSION: String
class Channel
attr_reader name: String
attr_reader messages: Array[Message]
attr_reader users: Array[User | Bot] # `|` означає об'єднані типи, `User` або `Bot`.
def initialize: (String) -> void
def post: (String, from: User | Bot) -> Message # Підтримується перевантаження методів.
| (File, from: User | Bot) -> Message
end
end
Див. README gem rbs для більше деталей.
Ractor (експериментально)
Ractor - це абстракція конкурентності, подібна до Actor-моделі, розроблена для надання функції паралельного виконання без проблем з потокобезпекою.
Ви можете створити кілька ractor та запустити їх паралельно. Ractor дозволяє створювати потокобезпечні паралельні програми, оскільки ractor не можуть ділитися звичайними об’єктами. Комунікація між ractor підтримується передачею повідомлень.
Щоб обмежити обмін об’єктами, Ractor вводить кілька обмежень до синтаксису Ruby (без кількох Ractor немає змін).
Специфікація та реалізація не дозріли та зміняться в майбутньому, тому ця функція позначена як експериментальна та показує попередження про експериментальну функцію, якщо Ractor створено.
Наступна невелика програма обчислює prime? паралельно з двома ractor та приблизно в 2 рази швидше з двома або більше ядрами, ніж послідовна програма.
require 'prime'
# n.prime? з надісланими цілими числами в r1, r2 працюють паралельно
r1, r2 = *(1..2).map do
Ractor.new do
n = Ractor.recv
n.prime?
end
end
# надіслати параметри
r1.send 2**61 - 1
r2.send 2**61 + 15
# чекати результати expr1, expr2
p r1.take #=> true
p r2.take #=> true
див. doc/ractor.md для більше деталей.
Scheduler (Експериментально)
Thread#scheduler введено для перехоплення блокуючих операцій. Це дозволяє легку конкурентність без зміни існуючого коду.
Зараз підтримуються класи/методи:
Mutex#lock,Mutex#unlock,Mutex#sleepConditionVariable#waitQueue#pop,SizedQueue#pushThread#joinKernel#sleepIO#wait,IO#read,IO#writeта пов’язані методи (наприклад,#wait_readable,#gets,#putsтощо).IO#selectне підтримується.
Поточна точка входу для конкурентності - Fiber.schedule{...}, однак це може змінитися до випуску Ruby 3.
Зараз доступний тестовий scheduler в Async::Scheduler. Див. doc/scheduler.md для більше деталей. [Функція #16786]
ОБЕРЕЖНО: Ця функція сильно експериментальна. Як ім’я, так і функція зміняться в наступному preview випуску.
Інші помітні нові функції
-
Додано оператор правостороннього присвоєння.
fib(10) => x p x #=> 55 -
Додано нескінченне визначення методу.
def square(x) = x * x -
Додано find pattern.
case ["a", 1, "b", "c", 2, "d", "e", "f", 3] in [*pre, String => x, String => y, *post] p pre #=> ["a", 1] p x #=> "b" p y #=> "c" p post #=> [2, "d", "e", "f", 3] end -
Hash#exceptтепер вбудований.h = { a: 1, b: 2, c: 3 } p h.except(:a) #=> {:b=>2, :c=>3} -
Memory view додано як експериментальну функцію
- Це новий набір C-API для обміну сирою областю пам’яті, такою як числовий масив та растрове зображення, між бібліотеками розширень. Бібліотеки розширень можуть також ділитися метаданими області пам’яті, що складається з форми, формату елемента тощо. Використовуючи такі метадані, бібліотеки розширень можуть навіть правильно ділитися багатовимірним масивом. Ця функція розроблена з посиланням на buffer protocol Python.
Покращення продуктивності
- Багато покращень було реалізовано в MJIT. Див. NEWS детально.
Інші помітні зміни з 2.7
- Ключові аргументи розділені від інших аргументів.
- В принципі, код, який виводить попередження на Ruby 2.7, не працюватиме. Див. документ детально.
-
До речі, пересилання аргументів тепер підтримує початкові аргументи.
def method_missing(meth, ...) send(:"do_#{ meth }", ...) end
-
Функція
$SAFEбула повністю видалена; тепер це звичайна глобальна змінна. -
Порядок backtrace був зворотний в Ruby 2.5, але це було скасовано. Тепер він поводиться як Ruby 2.4; повідомлення про помилку та номер рядка, де виникає виняток, виводяться спочатку, а його викликачі виводяться пізніше.
- Деякі стандартні бібліотеки оновлено.
- RubyGems 3.2.0.rc.1
- Bundler 2.2.0.rc.1
- IRB 1.2.6
- Reline 0.1.5
- Наступні бібліотеки більше не є включеними gems.
Встановіть відповідні gems для використання цих функцій.
- net-telnet
- xmlrpc
- Підвищено default gems до bundled gems.
- rexml
- rss
- Підвищено stdlib до default gems. Наступні default gems були опубліковані на rubygems.org
- abbrev
- base64
- English
- erb
- find
- io-nonblock
- io-wait
- net-ftp
- net-http
- net-imap
- net-protocol
- nkf
- open-uri
- optparse
- resolv
- resolv-replace
- rinda
- securerandom
- set
- shellwords
- tempfile
- time
- tmpdir
- tsort
- weakref
Див. NEWS або логи комітів для більше деталей.
З цими змінами, 3385 файлів змінено, 150159 додано(+), 124949 видалено(-) з Ruby 2.7.0!
Будь ласка, спробуйте Ruby 3.0.0-preview1 та надішліть нам будь-який відгук!
Завантаження
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2
РОЗМІР: 15538340 SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4 SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f -
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz
РОЗМІР: 17747808 SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202 SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105 SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27 -
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz
РОЗМІР: 12703060 SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56 SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d -
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip
РОЗМІР: 22002645 SHA1: 4b5b61066373daf0a947d3fafe2645788504a164 SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
3.0.0-preview2 трейлер
Ми плануємо включити “type-profiler”, який є функцією статичного аналізу типів. Слідкуйте за оновленнями!
Що таке 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