Вийшов 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#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#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 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

Більше новин...