Wydanie języka programowania Ruby 2.7.0

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.

Głównym ulepszenia:

  • 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.

    Wydanie języka programowania Ruby 2.7.0

  • 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

    def foo(h, **kw); koniec; foo (klucz: 42) #ostrzegł
    def foo(h, klucz: 42); koniec; foo (klucz: 42) #ostrzegł
    def foo(h, **kw); koniec; foo({key: 42}) # OK
    def foo(h, klucz: 42); koniec; foo({key: 42}) # OK

    def foo(h={}, klucz: 42); koniec; foo("klucz" => 43, klucz: 42) #ostrzeżony
    def foo(h={}, klucz: 42); koniec; foo({"klucz" => 43, klucz: 42}) # ostrzeżony
    def foo(h={}, klucz: 42); koniec; foo({"klucz" => 43}, klucz: 42) # OK

    def foo(opt={}); koniec; foo(klawisz: 42) # OK

    def foo(h, **nil); koniec; foo(klucz: 1) #Błąd argumentu
    def foo(h, **nil); koniec; foo(**{key: 1}) #Błąd argumentu
    def foo(h, **nil); koniec; foo("str" ​​​​=> 1) # Błąd argumentu
    def foo(h, **nil); koniec; foo({key: 1}) # OK
    def foo(h, **nil); koniec; foo({"str" ​​​​=> 1}) # OK

    godz. = {}; def foo(*a) koniec; foo(**h) # [] godz = {}; def foo(a) koniec; foo(**h) # {} i ostrzeżenie
    godz. = {}; def foo(*a) koniec; foo(h) # [{}] godz = {}; def foo(a) koniec; foo(h) # {}

  • Okazja używając numerowanych domyślnych nazw zmiennych dla parametrów bloku.

    [1, 2, 3].each { stawia @1 } # jak [1, 2, 3].each { |i| stawia ja }

  • Eksperymentalna obsługa zakresów bez wartości początkowej.

    ary[..3] # tak samo jak ary[0..3] rel.where(sales: ..100)

  • Dodano metodę Enumerable#tally, która zlicza, ile razy występuje każdy element.

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

  • 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;

  • Biblioteki przeszły z dystrybucji podstawowej na zewnętrzne pakiety klejnotów
    CMath (klejnot cmath),
    Scanf (klejnot scanf),
    Muszla (klejnot muszli),
    Synchronizator (klejnot synchronizacji),
    ThreadsWait (klejnot oczekiwania),
    E2MM (klejnot e2mmap).

  • 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.

Źródło: opennet.ru

Dodaj komentarz