Вийшов Ruby 2.7.0-preview3

Опублікував naruse 23-11-2019
Переклав: Andrii Furmanets

Ми раді оголосити випуск Ruby 2.7.0-preview3.

Preview версія випущена для збору відгуків для фінального випуску, запланованого на грудень. Цей preview3 в основному випущено для підтвердження сумісності ключових аргументів.

Він також вводить ряд нових функцій та покращень продуктивності, найбільш помітні:

  • Compaction GC
  • Pattern Matching
  • Покращення REPL
  • Розділення позиційних та ключових аргументів

Compaction GC

Цей випуск вводить Compaction GC, який може дефрагментувати фрагментований простір пам’яті.

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

Метод GC.compact введено для компактування купи. Ця функція компактує живі об’єкти в купі, щоб використовувалося менше сторінок, та купа може бути більш CoW дружньою. [Функція #15626]

Pattern Matching [Експериментально]

Pattern matching, широко використовувана функція в функціональних мовах програмування, введена як експериментальна функція. [Функція #14912]

Вона може обходити заданий об’єкт та призначати його значення, якщо воно відповідає шаблону.

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

Для більше деталей, будь ласка, див. Pattern matching - Нова функція в Ruby 2.7.

Покращення REPL

irb, включене інтерактивне середовище (REPL; Read-Eval-Print-Loop), тепер підтримує багаторядкове редагування. Воно працює завдяки reline, сумісній з readline реалізації на чистому Ruby. Воно також надає інтеграцію rdoc. В irb ви можете відобразити довідку для заданого класу, модуля або методу. [Функція #14683], [Функція #14787], [Функція #14918]

Крім того, рядки джерела, показані в binding.irb, та результати inspect для об’єктів core-класів тепер кольорові.

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

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

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

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

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

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

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

ПРИМІТКА: Занадто багато попереджень про застарілість про несумісність ключових аргументів було вказано як занадто багатослівні. Зараз обговорюються два можливі рішення; вимкнення попереджень про застарілість за замовчуванням (#16345) або придушення дубльованих попереджень (#16289). Фінальне рішення не прийнято, але буде виправлено офіційним випуском.

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

  • Оператор посилання на метод, .:, був введений як експериментальна функція в попередніх preview, але був відкочений назад. [Функція #12125], [Функція #13581], [Функція #16275]

  • Нумерований параметр як параметр блоку за замовчуванням введено як експериментальну функцію. [Функція #4475]

  • Безпочатковий діапазон експериментально введено. Він може бути не таким корисним як нескінченний діапазон, але буде хорошим для цілей DSL. [Функція #14799]

    ary[..3]  # ідентично до ary[0..3]
    rel.where(sales: ..100)
    
  • Enumerable#tally додано. Він підраховує появу кожного елемента.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Виклик приватного методу на self тепер дозволено. [Функція #11297], [Функція #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Enumerator::Lazy#eager додано. Він генерує не-lazy enumerator з lazy enumerator. [Функція #15901]

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class               #=> Enumerator
    p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
    

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

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

    • JIT-компільований код перекомпілюється до менш оптимізованого коду, коли припущення оптимізації стає недійсним.

    • Інлайнінг методів виконується, коли метод вважається чистим. Ця оптимізація все ще експериментальна, і багато методів ще НЕ вважаються чистими.

    • Значення за замовчуванням --jit-min-calls змінено з 5 на 10,000.

    • Значення за замовчуванням --jit-max-cache змінено з 1,000 на 100.

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

  • Продуктивність CGI.escapeHTML покращено. GH-2226

  • Продуктивність Monitor та MonitorMixin покращено. [Функція #16255]

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

  • Деякі стандартні бібліотеки оновлено.
    • Bundler 2.1.0.pre.3 (Історія)
    • RubyGems 3.1.0.pre.3 (Історія)
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • Деякі інші бібліотеки, які не мають оригінальної версії, також оновлено.
  • Підвищено stdlib до default gems
    • Наступні default gems були опубліковані на rubygems.org
      • benchmark
      • cgi
      • delegate
      • getoptlong
      • net-pop
      • net-smtp
      • open3
      • pstore
      • singleton
    • Наступні default gems були лише підвищені в ruby-core, але ще не опубліковані на rubygems.org.
      • monitor
      • observer
      • timeout
      • tracer
      • uri
      • yaml
  • Proc.new та proc без блоку в методі, викликаному з блоком, тепер попереджають.

  • lambda без блоку в методі, викликаному з блоком, помиляється.

  • Оновлено версію Unicode та Emoji з 11.0.0 до 12.0.0. [Функція #15321]

  • Оновлено версію Unicode до 12.1.0, додаючи підтримку для U+32FF SQUARE ERA NAME REIWA. [Функція #15195]

  • Date.jisx0301, Date#jisx0301, та Date.parse підтримують нову японську еру. [Функція #15742]

  • Вимагаємо підтримки C99 компіляторами [Misc #15347]
  • Regexp#match{?} з nil піднімає TypeError як String, Symbol. [Функція #13083] відкочено назад

3895 файлів змінено, 213426 додано(+), 96934 видалено(-)

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

З цими змінами, stat з Ruby 2.6.0!

Насолоджуйтеся програмуванням з Ruby 2.7!

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

  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.bz2

    РОЗМІР: 14630824
    SHA1: 1fa35d8a26dfc814e92fa259095f4cf70f386f87
    SHA256: df2ddee659873e6fc30a8590ecffa49cf3a4ef81fa922b0d09f821b69ee88bc3
    SHA512: 5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.gz

    РОЗМІР: 16723536
    SHA1: 7554926ee29a344da4b53d67fc296d70fdbe60ca
    SHA256: 9baa1f5096ebc2a0923df628d7dc7105da3789c1bf8b873469d9010249736b00
    SHA512: 8fad3e761fd54036fee974a9f33e4db31d9a8a878b1181a08724388f5a1da548ab249136356f675797e9c43b565777bf22e6a419db1364336f134b31f4e75b33
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.xz

    РОЗМІР: 11923988
    SHA1: f3c54538915483e5ddc714ac23414e7c47048b12
    SHA256: ad9d61e55ac224e3447a762e001965839846f9658f87a0e792840887cfe61b8c
    SHA512: 2b6844f34d32f1013dc3110043e6ece33a083b20f1343dea9a14311bda0017e8f56fc7d73be1616999b22ce430d7ba59a77bb0892d27c6d1ec243c3860086133
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.zip

    РОЗМІР: 20691541
    SHA1: d18b494cda4db751d8b3f5026404e348f3f682e3
    SHA256: 2bc95f67f271b6a41fc3dd40536705b4a7974df8a2fa33ff0758a60822291781
    SHA512: af9f728aebc53693cbd9f78a632c82e851e9f83dfc0c53979fdc37c627b11482c8435ce12dbb1d5a7253e998ea989759be699e6a00aae18384d2d765650cb0d7
    

Що таке Ruby

Ruby вперше розроблено Matz (Yukihiro Matsumoto) у 1993 році, і зараз розробляється як Open Source. Він працює на кількох платформах та використовується по всьому світу, особливо для веб-розробки.

Останні новини

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