Вийшов Ruby 3.2.0 Preview 2

Опублікував naruse 09-09-2022
Переклав: Andrii Furmanets

Ми раді оголосити випуск Ruby 3.2.0-preview2. Ruby 3.2 додає багато функцій та покращень продуктивності.

Підтримка WASI на основі WebAssembly

Це початковий порт підтримки WASI на основі WebAssembly. Це дозволяє бінарному файлу CRuby бути доступним у веб-браузері, середовищі Serverless Edge та інших вбудовувачах WebAssembly/WASI. Зараз цей порт проходить базові та bootstrap тестові набори, які не використовують Thread API.

Передісторія

WebAssembly (Wasm) спочатку введено для запуску програм безпечно та швидко у веб-браузерах. Але його мета - запуск програм ефективно з безпекою на різних середовищах - довго бажана не лише вебом, але й загальними додатками.

WASI (The WebAssembly System Interface) розроблено для таких випадків використання. Хоча такі додатки потребують спілкування з операційними системами, WebAssembly працює на віртуальній машині, яка не мала системного інтерфейсу. WASI стандартизує це.

Підтримка WebAssembly/WASI в Ruby має на меті використати ці проекти. Вона дозволяє розробникам Ruby писати додатки, які працюють на такій обіцяній платформі.

Випадок використання

Ця підтримка заохочує розробників використовувати CRuby в середовищі WebAssembly. Приклад випадку використання - підтримка CRuby TryRuby playground. Тепер ви можете спробувати оригінальний CRuby у вашому веб-браузері.

Технічні моменти

Сьогоднішні WASI та WebAssembly самі мають деякі відсутні функції для реалізації Fiber, винятків та GC, оскільки вони все ще розвиваються, а також з міркувань безпеки. Тому CRuby заповнює прогалину, використовуючи Asyncify, який є технікою бінарного перетворення для контролю виконання в userland.

Крім того, ми побудували VFS поверх WASI, щоб ми могли легко упакувати додатки Ruby в один .wasm файл. Це робить розповсюдження додатків Ruby трохи простішим.

Пов’язані посилання

Regexp timeout

Введено функцію таймауту для зіставлення Regexp.

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError піднімається за одну секунду

Відомо, що зіставлення Regexp може зайняти несподівано довго. Якщо ваш код намагається зіставити можливо неефективний Regexp з ненадійним вводом, зловмисник може використати це для ефективної Denial of Service (так звана Regular expression DoS, або ReDoS).

Ризик DoS може бути запобігнутий або значно пом’якшений налаштуванням Regexp.timeout відповідно до вимог вашого додатку Ruby. Будь ласка, спробуйте це у вашому додатку та вітаємо ваш відгук.

Зауважте, що Regexp.timeout є глобальною конфігурацією. Якщо ви хочете використовувати різні налаштування таймауту для деяких спеціальних Regexps, ви можете використати ключове слово timeout для Regexp.new.

Regexp.timeout = 1.0

# Цей regexp не має таймауту
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)

long_time_re =~ "a" * 50000 + "x" # ніколи не переривається

Оригінальна пропозиція: https://bugs.ruby-lang.org/issues/17837

Інші помітні нові функції

Більше не включати джерела 3-х сторін

  • Ми більше не включаємо джерела 3-х сторін, такі як libyaml, libffi.

    • Джерело libyaml було видалено з psych. Вам може знадобитися встановити libyaml-dev на платформі Ubuntu/Debian. Назва пакета відрізняється на кожній платформі.

    • libffi буде видалено з fiddle на preview2

Мова

  • Анонімні rest та keyword rest аргументи тепер можуть передаватися як аргументи, замість просто використання в параметрах методу. [Функція #18351]

      def foo(*)
        bar(*)
      end
      def baz(**)
        quux(**)
      end
    
  • Proc, який приймає один позиційний аргумент та ключові слова, більше не буде автоплітуватися. [Помилка #18633]

    proc{|a, **k| a}.call([1, 2])
    # Ruby 3.1 та раніше
    # => 1
    # Ruby 3.2 та пізніше
    # => [1, 2]
    
  • Порядок оцінки присвоєння констант для констант, встановлених на явних об’єктах, зроблено узгодженим з порядком оцінки присвоєння одного атрибута. З цим кодом:

      foo::BAR = baz
    

    foo тепер викликається перед baz. Аналогічно, для множинних присвоєнь до констант використовується порядок оцінки зліва направо. З цим кодом:

        foo1::BAR1, foo2::BAR2 = baz1, baz2
    

    Тепер використовується наступний порядок оцінки:

    1. foo1
    2. foo2
    3. baz1
    4. baz2

    [Помилка #15928]

  • Find pattern більше не є експериментальним. [Функція #18585]

  • Методи, які приймають rest параметр (як *args) та бажають делегувати ключові аргументи через foo(*args), тепер повинні бути позначені ruby2_keywords (якщо це ще не так). Іншими словами, всі методи, які бажають делегувати ключові аргументи через *args, тепер повинні бути позначені ruby2_keywords, без винятку. Це зробить легшим перехід до інших способів делегації, коли бібліотека може вимагати Ruby 3+. Раніше прапорець ruby2_keywords зберігався, якщо метод, що приймає, приймав *args, але це була помилка та неузгодженість. Хороша техніка для знаходження потенційно відсутніх ruby2_keywords

    • це запустити тестовий набір, для місця, де він не проходить, знайти останній метод, який повинен приймати ключові аргументи, використати puts nil, caller, nil там, та перевірити кожен метод/блок у ланцюжку викликів, який повинен делегувати ключові слова, правильно позначений як ruby2_keywords. [Помилка #18625] [Помилка #16466]

      def target(**kw)
      end
      
      # Випадково працювало без ruby2_keywords в Ruby 2.7-3.1, ruby2_keywords
      # потрібен в 3.2+. Так само як (*args, **kwargs) або (...) були б потрібні на
      # обох #foo та #bar при міграції від ruby2_keywords.
      ruby2_keywords def bar(*args)
        target(*args)
      end
      
      ruby2_keywords def foo(*args)
        bar(*args)
      end
      
      foo(k: 1)
      

Покращення продуктивності

YJIT

  • Підтримка arm64 / aarch64 на UNIX платформах.
  • Збірка YJIT вимагає Rust 1.58.1+. [Функція #18481]

Інші помітні зміни з 3.1

  • Hash
    • Hash#shift тепер завжди повертає nil, якщо hash порожній, замість повернення значення за замовчуванням або виклику default proc. [Помилка #16908]
  • MatchData
  • Module
  • Proc
  • Refinement
  • Set
    • Set тепер доступний як вбудований клас без необхідності require "set". [Функція #16989] Він зараз автозавантажується через константу Set або виклик Enumerable#to_set.
  • String
  • Struct
    • Клас Struct також може бути ініціалізований з ключовими аргументами без keyword_init: true на Struct.new [Функція #16806]

Проблеми сумісності

Примітка: Виключаючи виправлення помилок функцій.

Видалені константи

Наступні застарілі константи видалено.

Видалені методи

Наступні застарілі методи видалено.

Проблеми сумісності Stdlib

  • Psych більше не включає джерела libyaml. Користувачі повинні встановити бібліотеку libyaml самостійно через систему пакетів. [Функція #18571]

Оновлення C API

Видалені C API

Наступні застарілі API видалено.

  • Змінна rb_cData.
  • Функції “taintedness” та “trustedness”. [Функція #16131]

Оновлення стандартних бібліотек

  • Наступні default gem оновлено.

    • TBD
  • Наступні включені gems оновлено.

    • TBD
  • Наступні default gems тепер є bundled gems. Вам потрібно додати наступні бібліотеки до Gemfile в середовищі bundler.

    • TBD

Див. NEWS або логи комітів для більше деталей.

З цими змінами, 2393 файлів змінено, 168931 додано(+), 113411 видалено(-) з Ruby 3.1.0!

Завантаження

  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.tar.gz

    РОЗМІР: 19816780
    SHA1: 2106c77fc1600daf41ae137ecc4cf7937e27f67f
    SHA256: 8a78fd7a221b86032f96f25c1d852954c94d193b9d21388a9b434e160b7ed891
    SHA512: 5e9ddcb1a43cff449b0062cc716bfb80a9ebbb14a1b063f34005e2998c2c5033badb44e882232db9b2fceda9376f6615986e983511fda2575d60894752b605cc
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.tar.xz

    РОЗМІР: 14578112
    SHA1: 538b3ea4dc0d99f60f8bd6f71e65a56ceeb41c18
    SHA256: 01fac0929dccdabc0686c1109da6c187897a401da9ff8851242befa92f7fd430
    SHA512: 0f4cc919284fdfa1a42b6381760d1b3a4660da4b0fcdd2adf01ea04a425548b3c5ac090866915675db73964a1055090e54dd97cf4628cbb69403e541c71c28ff
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview2.zip

    РОЗМІР: 24150109
    SHA1: 69ffffc52cad626166f73f21f25c29c9d73fe0e8
    SHA256: 67f9ad3110be1975b3ce547c0a6e2c910dfc1945fd6e9bb1bd340568897c6554
    SHA512: 1447e099e7a8da0ff206fda6f4e466640d6e86e9da8148315ab0154684b1fd22c02c0022b5a2f4d3fc00103b4e8cef8e35a770174921fd8c6abeca9ad41c1818
    

Що таке 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

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