Izdanje programskog jezika Ruby 2.7.0

Nakon godinu dana razvoja objavljeno pustiti Ruby 2.7.0, dinamički objektno orijentisani programski jezik koji je veoma efikasan u razvoju programa i uključuje najbolje karakteristike Perl, Java, Python, Smalltalk, Eiffel, Ada i Lisp. Projektni kod se distribuira pod licencama BSD („BSDL s 2 klauzule“) i „Ruby“, što se odnosi na najnoviju verziju GPL licence i potpuno je kompatibilno sa GPLv3. Ruby 2.7 je sedmo veliko izdanje koje se proizvodi kao dio planiranog razvojnog procesa koji uključuje izdvajanje godinu dana za poboljšanja karakteristika i izdanje zakrpe od 2-3 mjeseca.

Glavni poboljšanja:

  • eksperimentalni podrška podudaranje uzoraka (podudaranje uzoraka) za ponavljanje preko datog objekta i dodjelu vrijednosti ako postoji podudaranje uzorka.

    slučaj [0, [1, 2, 3]] u [a, [b, *c]] pa #=> 0
    pb #=> 1
    kom #=> [2, 3] kraj

    slučaj {a: 0, b: 1}
    u {a: 0, x: 1}
    :nedostupno
    u {a: 0, b: var}
    p var #=> 1
    Kraj

  • Ljuska interaktivnih kalkulacija irb (REPL, Read-Eval-Print-Loop) sada ima mogućnost uređivanja u više redova, implementirano korištenjem biblioteke kompatibilne sa readline-om linijanapisano u Ruby-u. Integrisana je podrška za rdoc, koja omogućava pregled referentnih informacija o određenim klasama, modulima i metodama u irb-u. Omogućeno je obojeno isticanje linija sa kodom prikazanim kroz Binding#irb i rezultati pregleda objekata osnovne klase.

    Izdanje programskog jezika Ruby 2.7.0

  • Dodan je kompaktni sakupljač smeća (Compaction GC) koji može defragmentirati regiju memorije, rješavajući probleme sporih performansi i povećane potrošnje memorije zbog fragmentacije memorije koja se javlja tokom rada nekih Ruby aplikacija s više niti. Za pakiranje objekata na hrpu predložio GC.compact metoda za smanjenje broja korištenih memorijskih stranica i optimizaciju hrpe za operacije
    Krava (copy-on-write).

  • Izvršeno priprema za razdvajanje argumenata na osnovu pozicije na listi ("def foo(a,b,c)") i ključnih reči ("def foo(key: val)"). Automatska konverzija argumenata zasnovana na ključnim riječima i poziciji je zastarjela i neće biti podržana u grani Ruby 3.0. Konkretno, zastarjelo je korištenje posljednjeg argumenta kao parametara ključne riječi, prosljeđivanja argumenata baziranih na ključnoj riječi kao posljednjeg parametra heširanja i podjele posljednjeg argumenta na pozicione i parametre ključne riječi.

    def foo(ključ: 42); kraj; foo({ključ: 42}) #upozoreno
    def foo(**kw); kraj; foo({ključ: 42}) #upozoreno
    def foo(ključ: 42); kraj; foo(**{ključ: 42}) # OK
    def foo(**kw); kraj; foo(**{ključ: 42}) # OK

    def foo(h, **kw); kraj; foo(ključ: 42) #upozoren
    def foo(h, ključ: 42); kraj; foo(ključ: 42) #upozoren
    def foo(h, **kw); kraj; foo({ključ: 42}) # OK
    def foo(h, ključ: 42); kraj; foo({ključ: 42}) # OK

    def foo(h={}, ključ: 42); kraj; foo("key" => 43, ključ: 42) #upozoren
    def foo(h={}, ključ: 42); kraj; foo({"key" => 43, ključ: 42}) # upozoreno
    def foo(h={}, ključ: 42); kraj; foo({"key" => 43}, ključ: 42) # OK

    def foo(opt={}); kraj; foo( ključ: 42 ) # OK

    def foo(h, **nil); kraj; foo(ključ: 1) # ArgumentError
    def foo(h, **nil); kraj; foo(**{ključ: 1}) # ArgumentError
    def foo(h, **nil); kraj; foo("str" ​​=> 1) # ArgumentError
    def foo(h, **nil); kraj; foo({ključ: 1}) # OK
    def foo(h, **nil); kraj; foo({"str" ​​=> 1}) # OK

    h = {}; def foo(*a) end; foo(**h) # [] h = {}; def foo(a) kraj; foo(**h) # {} i upozorenje
    h = {}; def foo(*a) end; foo(h) # [{}] h = {}; def foo(a) kraj; foo(h) # {}

  • Sposobnost koristeći numerisana imena varijabli po defaultu za parametre bloka.

    [1, 2, 3].each { stavlja @1 } # kao [1, 2, 3].each { |i| stavlja i }

  • Eksperimentalna podrška za opsege bez početne vrijednosti.

    ary[..3] # isto kao ary[0..3] rel.where(sales: ..100)

  • Dodan metod Enumerable#tally, koji broji koliko puta se svaki element pojavljuje.

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

  • Poziv privatnog metoda je dozvoljen sa "self" literalom

    def foo
    Kraj
    privatno :foo
    self.foo

  • Dodan metod Enumerator::Lazy#eager za generiranje redovnog nabrajanja od lijenog (Enumerator::Lazy) nabrajanja.

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.mapa {|x| x + "!" }.željan
    p e.class #=> Enumerator
    e.mapa {|x| x + "?" } #=> [“FOO!?”, “BAR!?”, “BAZ!?”]

  • Nastavljen je razvoj eksperimentalnog JIT kompajlera koji može značajno poboljšati performanse aplikacija na jeziku Ruby. JIT kompajler predložen u Rubyju prvo zapisuje C kod na disk, nakon čega poziva eksterni C prevodilac da generiše mašinske instrukcije (podržani su GCC, Clang i Microsoft VC ++). Nova verzija implementira metodu za inline implementaciju ako je potrebno, selektivnu primjenu načina optimizacije tokom kompilacije, zadana vrijednost "--jit-min-calls" je povećana sa 5 na 10000, a "--jit-max-cache" od 1000 do 100.
  • Poboljšane performanse CGI.escapeHTML, Monitor i MonitorMixin.
  • Module#name, true.to_s, false.to_s i nil.to_s osiguravaju da je vraćen niz koji je nepromijenjen za navedeni objekt.
  • Veličina binarnih datoteka koje generiše metoda RubyVM::InstructionSequence#to_binary je smanjena;
  • Ažurirane verzije ugrađenih komponenti, uključujući
    Bundle 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    String Scanner 1.0.3;

  • Biblioteke su prešle s osnovne distribucije na vanjske gem pakete
    CMath (cmath dragulj),
    Scanf (scanf dragulj),
    Školjka (dragulj od školjke),
    Sinkronizator (dragulj sinhronizacije),
    ThreadsWait (thwait gem),
    E2MM (e2mmap dragulj).

  • Zadani stdlib moduli su objavljeni na rubygems.org:
    mjerilo,
    cgi,
    delegat,
    getoptlong,
    net pop,
    net-smtp
    open3,
    Pstoran,
    singleton. Moduli monitora nisu premješteni na rubygems.org
    posmatrač,
    vrijeme je isteklo,
    tracer
    uri,
    yaml, koji se isporučuju samo sa ruby-jezgrom.

  • Izgradnja Ruby-a sada zahtijeva C kompajler koji podržava C99 standard.

izvor: opennet.ru

Dodajte komentar