

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

Release candidate випущено для збору відгуків для фінального випуску,
запланованого на 25 грудня.

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

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

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

Pattern matching, широко використовувана функція в функціональних мовах програмування,
введена як експериментальна функція.
[[Функція #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 - Нова функція в 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` ви можете відобразити довідку
для заданого класу, модуля або методу.
[[Функція #14683]](https://bugs.ruby-lang.org/issues/14683),
[[Функція #14787]](https://bugs.ruby-lang.org/issues/14787),
[[Функція #14918]](https://bugs.ruby-lang.org/issues/14918)

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

<video autoplay="autoplay" controls="controls" muted="muted" width="576" height="259">
  <source src="https://cache.ruby-lang.org/pub/media/irb_improved_with_key_take2.mp4" type="video/mp4">
</video>

## Compaction GC

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

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

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

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

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

* Коли виклик методу передає Hash як останній аргумент, і коли він
  не передає ключові слова, і коли викликаний метод приймає ключові слова, випускається
  попередження.  Щоб продовжити обробляти hash як ключові слова,
  додайте подвійний оператор splat, щоб уникнути попередження та забезпечити
  правильну поведінку в Ruby 3.

  ```ruby
  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.

  ```ruby
  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.

  ```ruby
  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.

  ```ruby
  def foo(opt={});  end; foo( key: 42 )   # OK
  ```

* Не-символи дозволені як ключі ключових аргументів, якщо метод приймає
  довільні ключові слова.
  [[Функція #14183]](https://bugs.ruby-lang.org/issues/14183)

  ```ruby
  def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  ```

* `**nil` дозволено у визначеннях методів, щоб явно позначити,
  що метод не приймає ключові слова. Виклик такого методу з ключовими словами
  призведе до ArgumentError.
  [[Функція #14183]](https://bugs.ruby-lang.org/issues/14183)

  ```ruby
  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]](https://bugs.ruby-lang.org/issues/14183)

  ```ruby
  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](https://bugs.ruby-lang.org/issues/16345))
або придушення дубльованих попереджень
([#16289](https://bugs.ruby-lang.org/issues/16289)).
Фінальне рішення не прийнято, але буде виправлено офіційним випуском.

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

* Оператор посилання на метод, `.:`, був введений
  як експериментальна функція в попередніх preview, але був відкочений назад.
  [[Функція #12125]](https://bugs.ruby-lang.org/issues/12125),
  [[Функція #13581]]( https://bugs.ruby-lang.org/issues/13581),
  [[Функція #16275]](https://bugs.ruby-lang.org/issues/16275)

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

* Безпочатковий діапазон експериментально введено.  Він може бути не таким
  корисним як нескінченний діапазон, але буде хорошим для цілей DSL.
  [[Функція #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` як отримувачем
  тепер дозволено.
  [[Функція #11297]](https://bugs.ruby-lang.org/issues/11297),
  [[Функція #16123]](https://bugs.ruby-lang.org/issues/16123)

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

* `Enumerator::Lazy#eager` додано.
  Він генерує не-lazy enumerator з lazy enumerator.
  [[Функція #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-компільований код перекомпілюється до менш оптимізованого коду, коли
    припущення оптимізації стає недійсним.

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

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

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

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

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

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

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

* Деякі стандартні бібліотеки оновлено.
  * Bundler 2.1.0.pre.3
    ([Історія](https://github.com/bundler/bundler/blob/2-1-stable/CHANGELOG.md#210pre3-november-8-2019))
  * RubyGems 3.1.0.pre.3
    ([Історія](https://github.com/rubygems/rubygems/blob/3.1/History.txt))
  * CSV 3.1.2
    ([NEWS](https://github.com/ruby/csv/blob/v3.1.2/NEWS.md))
  * Racc 1.4.15
  * REXML 3.2.3
    ([NEWS](https://github.com/ruby/rexml/blob/v3.2.3/NEWS.md))
  * RSS 0.2.8
    ([NEWS](https://github.com/ruby/rss/blob/v0.2.8/NEWS.md))
  * 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]](https://bugs.ruby-lang.org/issues/15321)

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

* `Date.jisx0301`, `Date#jisx0301`, та `Date.parse` підтримують
  нову японську еру.
  [[Функція #15742]](https://bugs.ruby-lang.org/issues/15742)

* Вимагаємо підтримки C99 компіляторами.
  [[Misc #15347]](https://bugs.ruby-lang.org/issues/15347)
  * Деталі нашого діалекту:
    <https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99>

Див. [NEWS](https://github.com/ruby/ruby/blob/v2_7_0_rc2/NEWS)
або [логи комітів](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0_rc2)
для більше деталей.

З цими змінами, [4184 файлів змінено, 226864 додано(+), 99937 видалено(-)](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0_rc2)
з Ruby 2.6.0!
Насолоджуйтеся програмуванням з Ruby 2.7!

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

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

      РОЗМІР: 14686646
      SHA1: e04680f57d8b7576637eb75b8b56aceeb1806992
      SHA256: 8f94ea7ba79b6e95225fb4a7870e882081182c3d12d58c4cad2a7d2e7865cf8e
      SHA512: 9010f72bb3f33b6cd3f515531e6e05198f295bb2a8a788e3a46cdfd776a9f6176b6ba8612f07f0236a11359302d2b77fdecca1dc6be33581edbb028069397a0a

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

      РОЗМІР: 16775053
      SHA1: 787a86023f0abe6ca9c0b31e95328725e8bb7814
      SHA256: b16cd92479e5648cc53425602e9dc6d76b18dd2cc180add2fd4c9f254646779d
      SHA512: d59910a140ea1b7ca7a64073dbbe4cbe8f11cd6fc68ea7874ca160e1a23549bd159f49f4d199002f9806e77d4426bff3aa81b62707d539e0710ece7b7ff83438

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

      РОЗМІР: 11965624
      SHA1: 1f9f30eaf1829250931c4c465ee1c15e07452e7d
      SHA256: c90d29fba655b2dd577ff755f084e4d1fe0673cfcd888af7ff5d0b2d2f449bb7
      SHA512: dba23aada4921c98eb90d216db656833d1759c4f611d5087e2a0123d932ab1c6704dfedc0d671d2d51b4b3949ff95b6aec012481141c6fce3988a3d0bc5d18b8

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

      РОЗМІР: 20642713
      SHA1: e0b6f91398d55436b776d7a5eae0faaf810b1578
      SHA256: ac87c1666cc840cad26083a067bae1975d1fdb41ca1f1569903c05bca1b61174
      SHA512: 4e84b1f59b574a59b5346d30a0770e06ad81a4838813cc8789157f4e1a3fcbe7ca75bf83663c20736024760f1b0675ca288f1cee7f8a28f8918c4e43b0d09982

## Що таке Ruby

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