Після року розробки опубліковано реліз Ruby 2.7.0, динамічної об'єктно-орієнтованої мови програмування, що відрізняється високою ефективністю розробки програм і увібрала в себе кращі риси Perl, Java, Python, Smalltalk, Eiffel, Ada і Lisp. Код проекту розповсюджується під ліцензіями BSD («2-clause BSDL») та «Ruby», яка посилається на останній варіант ліцензії GPL та повністю сумісна з GPLv3. Ruby 2.7 є сьомим значним випуском, підготовленим у рамках планового процесу розробки, що передбачає відведення року на підготовку функціональних покращень та формування кожні 2-3 місяці коригувальних випусків.
Експериментальна підтримка зіставлень із зразком (Узгодження шаблону), що дозволяють перебрати заданий об'єкт і призначити значення, якщо є збіг із зразком.
case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
pb #=> 1
pc #=> [2, 3] end
case {a: 0, b: 1}
in {a: 0, x: 1}
:unreachable
in {a: 0, b: var}
p var #=> 1
кінець
В оболонці інтерактивних обчислень irb (REPL, Read-Eval-Print-Loop) з'явилася можливість багаторядкового редагування, реалізована за допомогою readline-сумісної бібліотеки перекластинаписана на мові Ruby. Інтегрована підтримка rdoc, що дозволяє переглядати в irb довідкову інформацію за заданими класами, модулями та методами. Забезпечено кольорове підсвічування рядків з кодом, що показуються через Binding#irb та результатів інспектування об'єктів базових класів.
Доданий ущільнюючий збирач сміття (Compaction GC), який може виконувати дефрагментацію області пам'яті, вирішуючи проблеми зниження продуктивності та підвищення споживання пам'яті через фрагментацію пам'яті, що виникає в процесі роботи деяких багатопоточних Ruby-додатків. Для пакування об'єктів у купі запропонований метод GC.compact, що дозволяє знизити кількість використовуваних сторінок пам'яті та оптимізувати купу для операцій
CoW (copy-on-write).
Проведено підготовка до поділу аргументів, що визначаються на основі позиції у списку («def foo(a, b, c)») та ключових слів («def foo(key: val)»). Автоматичне перетворення аргументів на основі ключових слів та позиції оголошено застарілим і не підтримуватиметься у гілці Ruby 3.0. Зокрема, оголошено застарілим використання останнього аргументу як параметрів ключового слова, передачу аргументів на основі ключових слів як останнього параметра хешу та поділ останнього аргументу на позиційні та ключові параметри.
h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning
h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}
Можливість використання нумерованих імен змінних за промовчанням для параметрів блоку.
[1, 2, 3].each { puts @1} # як аналог [1, 2, 3].each { |i| puts i }
Експериментальна підтримка діапазонів без початкового значення.
Дозволено виклик приватного методу з літералом «self»
def foo
кінець
private :foo
self.foo
Доданий метод Enumerator::Lazy#eager для генерації звичайного перерахування з лінивого (Enumerator::Lazy) перерахування.
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-компілятора, що дозволяє відчутно підняти продуктивність додатків мовою Ruby. Запропонований у Ruby JIT-компілятор спочатку записує на диск код мовою Сі, після чого викликає зовнішній Си-компілятор для генерації машинних інструкцій (підтримується виклик GCC, Clang та Microsoft VC++). У новій версії реалізовано метод для inline-розгортання при необхідності, забезпечено вибіркове застосування режимів оптимізації при компіляції, значення за умовчанням «jit-min-calls» збільшено з 5 до 10000, а «jit-max-cache» з 1000 до 100 .
Підвищено продуктивність CGI.escapeHTML, Monitor та MonitorMixin.
У Module#name, true.to_s, false.to_s та nil.to_s забезпечено повернення рядка, незмінного для зазначеного об'єкта.
Скорочено розмір бінарних файлів, що генеруються методом 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;
З базового постачання у зовнішні gem-пакети винесено бібліотеки
CMath (cmath gem),
Scanf (scanf gem),
Shell (shell gem),
Synchronizer (sync gem),
ThreadsWait (thwait gem),
E2MM (e2mmap gem).
На rubygems.org опубліковані модулі stdlib, що поставляються за умовчанням:
контрольний показник,
cgi,
делегат,
getoptlong,
net-pop,
net-smtp,
open3,
pstore,
singleton. Не перенесені до rubygems.org модулі monitor
observer,
timeout,
слідодавець,
урі,
yaml, які постачаються лише у ruby-core.
Для складання Ruby тепер потрібен Сі-компілятр, який підтримує стандарт C99.