Ми раді повідомити про реліз Ruby 2.7.0.

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

* Зіставлення шаблонів
* Покращення REPL
* Компактизуючий GC
* Розділення позиційних і ключових аргументів

## Зіставлення шаблонів [Експериментально]

Зіставлення шаблонів (Pattern Matching), широко використовувана функція у функціональних мовах програмування, введено як експериментальну функцію.
[[Feature #14912]](https://bugs.ruby-lang.org/issues/14912)

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

```ruby
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 - New feature in Ruby 2.7](https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7).

## Покращення REPL

`irb`, вбудоване інтерактивне середовище (REPL; Read-Eval-Print-Loop), тепер підтримує багаторядкове редагування. Його забезпечує `reline`, бібліотека, сумісна з `readline`, реалізована на чистому Ruby. Також додано інтеграцію з rdoc. В `irb` можна відображати документацію для класів, модулів і методів.
[[Feature #14683]](https://bugs.ruby-lang.org/issues/14683),
[[Feature #14787]](https://bugs.ruby-lang.org/issues/14787),
[[Feature #14918]](https://bugs.ruby-lang.org/issues/14918)

Крім того, рядки коду, показані через `Binding#irb`, та результати інспекції об'єктів базових класів тепер підсвічуються кольором.

<video autoplay="autoplay" controls="controls" muted="muted" width="576" height="259" poster="https://cache.ruby-lang.org/pub/media/irb-reline-screenshot.png">
  <source src="https://cache.ruby-lang.org/pub/media/irb_improved_with_key_take3.mp4" type="video/mp4">
</video>

## Компактизуючий GC

Цей реліз вводить компактизуючий GC, який може дефрагментувати фрагментовану пам'ять.

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

Метод `GC.compact` введено для компактизації купи. Ця функція ущільнює живі об'єкти в купі, щоб використовувати менше сторінок, і купа може бути більш дружньою до CoW (copy-on-write).
[[Feature #15626]](https://bugs.ruby-lang.org/issues/15626)

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

Автоматичне перетворення ключових аргументів і позиційних аргументів застаріло і буде видалено в Ruby 3.
[[Feature #14183]](https://bugs.ruby-lang.org/issues/14183)

Докладніше див. статтю «[Separation of positional and keyword arguments in Ruby 3.0](https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/)».

## Інші важливі нові функції

* Нумеровані параметри як параметри блоків за замовчуванням.
  [[Feature #4475]](https://bugs.ruby-lang.org/issues/4475)

* Експериментально введено діапазон без початку.
  [[Feature #14799]](https://bugs.ruby-lang.org/issues/14799)

  ```ruby
  ary[..3]  # ідентично ary[0..3]
  rel.where(sales: ..100)
  ```

* Додано `Enumerable#tally`. Він підраховує кількість кожного елемента.

  ```ruby
  ["a", "b", "c", "b"].tally
  #=> {"a"=>1, "b"=>2, "c"=>1}
  ```

* Виклик приватного методу з літералом `self` як одержувачем тепер дозволено.
  [[Feature #11297]](https://bugs.ruby-lang.org/issues/11297),
  [[Feature #16123]](https://bugs.ruby-lang.org/issues/16123)

  ```ruby
  def foo
  end
  private :foo
  self.foo
  ```

* Додано `Enumerator::Lazy#eager`. Він створює не-лінивий перелічувач з лінивого.
  [[Feature #15901]](https://bugs.ruby-lang.org/issues/15901)

  ```ruby
  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-код перекомпільовується на менш оптимізований код, коли припущення оптимізації стає недійсним.
  * Виконується inline методів, коли метод вважається чистим.
  * Значення за замовчуванням `--jit-min-calls` змінено з 5 на 10 000.
  * Значення за замовчуванням `--jit-max-cache` змінено з 1 000 на 100.

* Стратегію кешування Fiber змінено, і створення fiber пришвидшено.
  [GH-2224](https://github.com/ruby/ruby/pull/2224)

* `Module#name`, `true.to_s`, `false.to_s` і `nil.to_s` тепер завжди повертають заморожений String.
  [Експериментально]
  [[Feature #16150]](https://bugs.ruby-lang.org/issues/16150)

* Покращено продуктивність `CGI.escapeHTML`.
  [GH-2226](https://github.com/ruby/ruby/pull/2226)

* Покращено продуктивність Monitor і MonitorMixin.
  [[Feature #16255]](https://bugs.ruby-lang.org/issues/16255)

## Інші важливі зміни порівняно з 2.6

* Деякі стандартні бібліотеки оновлено.
  * 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

* Наступні бібліотеки більше не bundled gems. Встановіть відповідні геми, щоб використовувати ці функції.
  * CMath (cmath gem)
  * Scanf (scanf gem)
  * Shell (shell gem)
  * Synchronizer (sync gem)
  * ThreadsWait (thwait gem)
  * E2MM (e2mmap gem)

* `profile.rb` видалено зі стандартної бібліотеки.

* Оновлено версію Unicode та Emoji з 11.0.0 до 12.0.0.
  [[Feature #15321]](https://bugs.ruby-lang.org/issues/15321)

* Оновлено версію Unicode до 12.1.0, додано підтримку U+32FF SQUARE ERA NAME REIWA.
  [[Feature #15195]](https://bugs.ruby-lang.org/issues/15195)

* Потрібна підтримка C99 від компіляторів.
  [[Misc #15347]](https://bugs.ruby-lang.org/issues/15347)

Докладніше див. [NEWS](https://github.com/ruby/ruby/blob/v2_7_0/NEWS)
або [історію комітів](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0).



З цими змінами [4190 файлів змінено, 227498 вставок(+), 99979 видалень(-)](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0) від Ruby 2.6.0!

Веселого Різдва, гарних свят і насолоджуйтесь програмуванням з Ruby 2.7!

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

* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2>

      SIZE: 14703381
      SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af
      SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26
      SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7

* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz>

      SIZE: 16799684
      SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5
      SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe
      SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927

* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz>

      SIZE: 11990900
      SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d
      SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343
      SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7

* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip>

      SIZE: 20571744
      SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80
      SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0
      SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b

## Що таке Ruby

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