Ruby

Ruby 2.7

Разом із Fedora 32 постачається версія Ruby 2.7. Із основним оновленням з Ruby 2.6 Fedora стає чудовою платформою для розробки мовою Ruby.

Зміни з часу випуску Ruby 2.6:

У Ruby 2.7 реалізовано декілька нових можливостей та удосконалень швидкодії.

Поліпшення у швидкодії

  • JIT [експериментальний]

  • Стратегію кешування fiber, а створення fiber пришвидшено.

  • Module#name, true.to_s, false.to_s і nil.to_s у новій версії завжди повертають заморожений рядок. Повернутий рядок завжди є однаковим для заданого об’єкта. [Експериментальна можливість]

  • Пришвидшено Monitor і MonitorMixin.

  • Пришвидшено CGI.escapeHTML.

  • Кеш методів Per-call-site, який було реалізовано ще у 1.9, удосконалено: підвищено ймовірність вдалого пошуку у кеші з 89% до 94%.

  • Метод RubyVM::InstructionSequence#to_binary створює компільований виконуваний файл. Розмір виконуваного файла зменшено.

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

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

    • Bundler 2.1.2

    • RubyGems 3.1.2

    • Racc 1.4.15

    • CSV 3.1.2

    • REXML 3.2.3

    • RSS 0.2.8

    • StringScanner 1.0.3

    • Також оновлено деякі інші бібліотеки без початкового номера версії.

  • Вказані нижче бібліотеки більше не є пов’язаними із основним пакунком джемами. Щоб скористатися можливостями, які вони надають, встановіть відповідні джеми.

    • CMath (джем cmath)

    • Scanf (джем scanf)

    • Shell (джем shell)

    • Synchronizer (джем sync)

    • ThreadsWait (джем thwait)

    • E2MM (джем e2mmap)

  • profile.rb було вилучено зі стандартної бібліотеки.

  • stdlib зроблено типовим джемом

    • Такі типові джеми було оприлюднено на rubygems.org

      • benchmark

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • Такі типові джеми було просунути до ruby-core, але ще не оприлюднено на rubygems.org.

      • monitor

      • observer

      • timeout

      • tracer

      • uri

      • yaml

  • Реалізовано попередження при виклику proc.new і proc без блокування у методі, який викликається з блокуванням.

  • Виклик лямбди без блокування у методі, який викликається з блокуванням призводить до показу виключення.

  • Оновлено версії Юнікоду та емодзі з 11.0.0 до 12.0.0.

  • Оновлено версію Юнікоду до 12.1.0, додано підтримку U+32FF SQUARE ERA NAME REIWA.

  • У Date.jisx0301, Date#jisx0301 і Date.parse реалізовано підтримку нової японської ери.

  • Реалізовано вимогу до компіляторів щодо підтримки C99.

Докладні зміни

Відповідність взірцям [експериментальна можливість]

Співставлення зі зразком — широко використовувана можливість у мовах функційного програмування. Її впроваджено як експериментальну можливість. Вона надає можливість обійти заданий об’єкт і визначити його, якщо він відповідає зразку.

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

Удосконалення REPL

У новій версії irb, пов’язаного інтерактивного середовища (REPL; Read-Eval-Print-Loop), передбачено підтримку багаторядкового редагування. Її підсилено reline, сумісною із readline бібліотекою, яку реалізовано на чистому Ruby. Також у бібліотеці передбачено інтеграцію із rdoc. У irb ви зможете переглядати посилання для заданого класу, модуля або методу.

Збирач сміття із ущільненням

У цьому випуску впроваджено збирач сміття із ущільненням (Compaction GC), який може усувати фрагментування фрагментованого простору у пам’яті.

Деякі програми Ruby із багатопотоковою обробкою даних можуть спричиняти фрагментацію пам’яті, що призводить до надмірного використання пам’яті та знижує швидкість роботи.

Розробниками було впроваджено метод GC.compact для ущільнення «купи». Ця функція ущільнює «живі» об’єкти у «купі», зменшуючи кількість використаних сторінок. «Купа» при цьому стає зручнішою для CoW (copy-on-write).

Відокремлення позиційних аргументів та аргументів ключових слів

Автоматичне перетворення аргументів ключових слів та позиційних аргументів визнано застарілим. Це перетворення буде вилучено у Ruby 3.

Зміни
  • Якщо виклик методу передає Hash у останньому аргументі і потім не передає ключових слів, і якщо викликаний метод приймає ключові слова, буде надіслано попередження. Щоб продовжити обробку хешу як ключових слів, додайте оператор подвійної зірочки, щоб уникнути попередження із забезпечити належну поведінку програми у 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
  • Якщо виклик методу передає ключові слова до методу, який приймає ключові слова, але не передає достатньої кількості позиційних аргументів, ключові слова обробляються як останній обов’язковий позиційний аргумент, а інтерпретатор надсилає попередження. Передавайте аргумент як хеш, замість ключових слів, щоб уникнути попередження і забезпечити належну поведінку програми у 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
  • Якщо метод приймає специфічні ключові слова, але не ключові слова із зірочкою, а передано хеш або ключові слова із зірочкою до методу, який включає ключі Symbol і не-Symbol, хеш поділятиметься, але інтерпретатор надішле попередження. Вам слід оновити код виклику, щоб передавати окремі хеші і забезпечити належну поведінку програми у 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
  • Якщо метод не приймає ключових слів і його викликано із ключовими словами, ключові слова оброблятимуться як позиційний хеш, без попередження. Це варіант коду продовжить працювати у Ruby 3.

        def foo(opt={});  end; foo( key: 42 )   # OK
  • Несимволічні змінні можна використовувати як ключі аргументу ключового слова, якщо метод приймає довільні ключові слова.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • Уможливлено використання **nil у визначеннях методів для явного позначення, що метод не приймає ключових слів. Виклик такого методу із ключовими словами призведе до ArgumentError.

        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
  • Передавання порожнього ключового слова із зірочкою до методу, який не приймає ключових слів, більше не призводить до передавання порожнього хешу, хіба що порожній хеш є необхідним для обов’язкового параметра (у цьому випадку буде надіслано попередження). Приберіть подвійну зірочку, щоб продовжити передавання позиційного хешу.

        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)    # {}

Якщо ви хочете вимкнути попередження про застарівання, будь ласка, скористайтеся аргументом командного рядка -W:no-deprecated або додайте Warning[:deprecated] = false у ваш код.

Щоб дізнатися більше про цей випуск, ознайомтеся із оголошенням про випуск від розробників.

Jekyll 4.0

Засіб створення статичних сторінок Jekyll та його додатки було оновлено до версії 4.0.0. У цій версії внесено такі зміни, порівняно із версією 3.8:

  • Значне підвищення швидкодії

  • Чищення і виправлення вад

  • Інші незначні зміни, які не сумісні із попереднім випуском

Щоб дізнатися більше про Jekyll 4.0.0, ознайомтеся із https://jekyllrb.com/news/2019/08/20/jekyll-4-0-0-released/.