Izdanje programskog jezika Ruby 2.7.0

Nakon godinu dana razvoja objavljen puštanje Ruby 2.7.0, dinamički objektno orijentirani programski jezik koji je vrlo učinkovit u razvoju programa i uključuje najbolje značajke Perla, Jave, Pythona, Smalltalka, Eiffela, Ade i Lispa. Kôd projekta distribuira se pod licencama BSD ("2-clause BSDL") i "Ruby", što se odnosi na najnoviju verziju GPL licence i potpuno je kompatibilno s GPLv3. Ruby 2.7 je sedmo veliko izdanje koje će biti napravljeno kao dio planiranog razvojnog procesa koji uključuje odlaganje godinu dana za poboljšanja značajki i izdanje zakrpe za 2-3 mjeseca.

Glavni poboljšanja:

  • Eksperimentalno podržati podudaranje uzoraka (Usklađivanje uzorka) za ponavljanje preko zadanog objekta i dodjeljivanje vrijednosti ako postoji podudaranje uzorka.

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

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

  • Ljuska interaktivnih izračuna irb (REPL, Read-Eval-Print-Loop) sada ima mogućnost uređivanja u više redaka, implementirano pomoću biblioteke kompatibilne s readline-om ponovno postavitinapisano u rubinu. Integrirana je podrška za rdoc, koja omogućuje pregled referentnih informacija o određenim klasama, modulima i metodama u irb-u. Omogućeno je isticanje redaka u boji s kodom prikazanim kroz Binding#irb i rezultatima pregledavanja objekata osnovne klase.

    Izdanje programskog jezika Ruby 2.7.0

  • Dodan je kompaktni skupljač smeća (Compaction GC) koji može defragmentirati regiju memorije, rješavajući probleme sporog rada i povećane potrošnje memorije zbog fragmentacije memorije do koje dolazi tijekom rada nekih Ruby aplikacija s više niti. Za pakiranje objekata na gomilu zaprosio Metoda GC.compact za smanjenje broja korištenih memorijskih stranica i optimiziranje gomile za operacije
    CoW (copy-on-write).

  • Izvedeno priprema za odvajanje argumenata na temelju položaja na popisu ("def foo(a,b,c)") i ključnih riječi ("def foo(key: val)"). Automatska pretvorba argumenata na temelju ključnih riječi i položaja je zastarjela i neće biti podržana u grani Ruby 3.0. Konkretno, zastarjelo je korištenje zadnjeg argumenta kao parametara ključne riječi, prosljeđivanje argumenata temeljenih na ključnoj riječi kao posljednjeg parametra raspršivanja i dijeljenje posljednjeg argumenta na pozicijske i ključne parametre.

    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) #upozoreno
    def foo(h, ključ: 42); kraj; foo(ključ: 42) #upozoreno
    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("ključ" => 43, ključ: 42) #upozoreno
    def foo(h={}, ključ: 42); kraj; foo({"key" => 43, key: 42}) # upozorenje
    def foo(h={}, ključ: 42); kraj; foo({"key" => 43}, key: 42) # OK

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

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

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

  • Prilika korištenje numeriranih naziva varijabli prema zadanim postavkama za parametre bloka.

    [1, 2, 3].svaki { stavlja @1 } # poput [1, 2, 3].svaki { |i| stavlja i }

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

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

  • Dodana metoda Enumerable#tally koja broji koliko se puta svaki element pojavljuje.

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

  • Poziv privatne metode dopušten je s literalom "sebe".

    deffoo
    kraj
    privatno :foo
    self.foo

  • Dodana je metoda Enumerator::Lazy#eager za generiranje normalnog popisivanja iz lijenog (Enumerator::Lazy) popisivanja.

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

  • Nastavljen je razvoj eksperimentalnog JIT prevoditelja koji može značajno poboljšati performanse aplikacija u Ruby jeziku. JIT prevodilac predložen u Rubyju prvo zapisuje C kod na disk, nakon čega poziva vanjski C prevodilac za generiranje strojnih instrukcija (podržani su GCC, Clang i Microsoft VC ++). Nova verzija implementira metodu za inline implementaciju ako je potrebno, selektivnu primjenu načina optimizacije tijekom kompilacije, zadana vrijednost "--jit-min-calls" povećana je s 5 na 10000, a "--jit-max-cache" od 1000 do 100 .
  • Poboljšana izvedba CGI.escapeHTML, Monitor i MonitorMixin.
  • Module#name, true.to_s, false.to_s i nil.to_s osiguravaju vraćanje niza koji je nepromijenjen za navedeni objekt.
  • Veličina binarnih datoteka generiranih metodom RubyVM::InstructionSequence#to_binary je smanjena;
  • Ažurirane verzije ugrađenih komponenti, uključujući
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    Skener nizova 1.0.3;

  • Knjižnice su premještene s osnovne distribucije na vanjske gem pakete
    CMath (cmath gem),
    Scanf (skenf dragulj),
    Školjka (dragulj od školjke),
    Sinkronizator (sinkronizacija dragulj),
    ThreadsWait (thwait gem),
    E2MM (e2mmap dragulj).

  • Zadani stdlib moduli objavljeni su na rubygems.org:
    mjerilo,
    cgi,
    delegat,
    getoptlong,
    net pop,
    net smtp,
    otvoriti3,
    pstore,
    samac. Moduli monitora nisu premješteni na rubygems.org
    posmatrač,
    pauza,
    tragač,
    uri,
    yaml, koji se isporučuju samo s ruby-coreom.

  • Izgradnja Rubyja sada zahtijeva C kompajler koji podržava C99 standard.

Izvor: opennet.ru

Dodajte komentar