Po roku rozwoju opublikowany wydanie Ruby 2.7.0, dynamiczny, obiektowy język programowania, który jest bardzo wydajny w tworzeniu programów i zawiera najlepsze funkcje Perla, Java, Python, Smalltalk, Eiffel, Ada i Lisp. Kod projektu rozpowszechniany jest na licencji BSD („2-klauzulowa BSDL”) oraz „Ruby”, która nawiązuje do najnowszej wersji licencji GPL i jest w pełni kompatybilna z GPLv3. Ruby 2.7 jest siódmą główną wersją po planowanym procesie rozwoju, który trwa rok w celu przygotowania ulepszeń funkcjonalnych i wydaje aktualizacje konserwacyjne co 2-3 miesiące.
eksperymentalny wsparcie dopasowanie wzorca (Dopasowanie wzorca), aby wykonać iterację po danym obiekcie i przypisać wartość, jeśli istnieje dopasowanie wzorca.
przypadek [0, [1, 2, 3]] w [a, [b, *c]] pa #=> 0
pb #=> 1
szt #=> [2, 3] koniec
przypadek {a: 0, b: 1}
w{a:0,x:1}
:nieosiągalny
w {a: 0, b: var}
p zmienna #=> 1
zakończenia
Powłoka interaktywnych obliczeń irb (REPL, Read-Eval-Print-Loop) ma teraz możliwość edycji wieloliniowej, zaimplementowanej przy użyciu biblioteki kompatybilnej z readline wyrównaćnapisane w Ruby. Zintegrowano obsługę rdoc, umożliwiając przeglądanie informacji referencyjnych na temat określonych klas, modułów i metod w irb. Zapewniono podświetlanie kolorami linii kodu pokazanych poprzez Binding#irb oraz wyników inspekcji obiektów klasy bazowej.
Dodano kompaktowy moduł zbierający elementy bezużyteczne (Compaction GC), który może defragmentować obszar pamięci, rozwiązując problemy niskiej wydajności i zwiększonego zużycia pamięci z powodu fragmentacji pamięci występującej podczas działania niektórych wielowątkowych aplikacji Ruby. Aby spakować obiekty na stertę proponowane Metoda GC.compact służąca do zmniejszenia liczby używanych stron pamięci i optymalizacji sterty pod kątem operacji
CoW (kopiowanie przy zapisie).
Przeprowadzone przygotowanie do rozdzielania argumentów na podstawie pozycji na liście („def foo(a,b,c)”) i słów kluczowych („def foo(key: val)”). Automatyczna konwersja argumentów na podstawie słów kluczowych i pozycji została uznana za przestarzałą i nie będzie obsługiwana w gałęzi Ruby 3.0. W szczególności przestało obowiązywać używanie ostatniego argumentu jako parametrów słowa kluczowego, przekazywanie argumentów opartych na słowach kluczowych jako ostatniego parametru skrótu i dzielenie ostatniego argumentu na parametry pozycyjne i parametry słowa kluczowego.
def foo (klucz: 42); koniec; foo({key: 42}) #ostrzeżony
zdecydowanie foo(**kw); koniec; foo({key: 42}) #ostrzeżony
def foo (klucz: 42); koniec; foo(**{key: 42}) # OK
zdecydowanie foo(**kw); koniec; foo(**{key: 42}) # OK
Dozwolone wywołanie metody prywatnej z literałem „self”.
deffoo
zakończenia
prywatny: fuu
self.foo
Dodano metodę Enumerator::Lazy#eager do generowania regularnego wyliczenia na podstawie leniwego wyliczenia (Enumerator::Lazy).
a = %w(foo bar baz)
e = a.lazy.map {|x| x.upcase }.map {|x| x + „!” }.chętny
p e.class #=> Licznik
e.mapa {|x| x + „?” } #=> [„FOO!?”, „BAR!?”, „BAZ!?”]
Kontynuowano rozwój eksperymentalnego kompilatora JIT, który może znacząco poprawić wydajność aplikacji w języku Ruby. Kompilator JIT Ruby najpierw zapisuje kod C na dysk, a następnie wywołuje zewnętrzny kompilator C w celu wygenerowania instrukcji maszynowych (obsługuje wywoływanie GCC, Clang i Microsoft VC++). W nowej wersji zaimplementowano metodę wdrażania inline w razie potrzeby, zapewniono selektywne stosowanie trybów optymalizacji podczas kompilacji, domyślną wartość „--jit-min-calls” zwiększono z 5 do 10000, a „--jit-max- cache” z 1000 na 100 .
Poprawiona wydajność CGI.escapeHTML, Monitor i MonitorMixin.
Module#name, true.to_s, false.to_s i nil.to_s zapewniają, że zwracany jest ciąg znaków, który nie ulega zmianie dla określonego obiektu.
Zmniejszono rozmiar plików binarnych generowanych metodą RubyVM::InstructionSequence#to_binary;
Zaktualizowane wersje wbudowanych komponentów, w tym
Pakiet 2.1.2, RubyGems 3.1.2,
Racc 1.4.15,
CSV 3.1.2, REXML 3.2.3,
RSS0.2.8,
Skaner ciągów 1.0.3;
Domyślne moduły stdlib są publikowane na rubygems.org:
odniesienia,
komputerowe,
delegat,
getoptlong,
pop netto,
smtp netto,
otwarte3,
sklep,
singel. Moduły monitora nie zostały przeniesione do rubygems.org
obserwator,
koniec czasu,
kreślarz,
ur,
yaml, które są dostępne tylko w Ruby-Core.
Budowanie Ruby wymaga teraz kompilatora C obsługującego standard C99.