Izdaja programskega jezika Ruby 2.7.0

Po letu razvoja objavljeno sprostitev Ruby 2.7.0, dinamičen objektno usmerjen programski jezik, ki je zelo učinkovit pri razvoju programov in vključuje najboljše lastnosti Perla, Jave, Pythona, Smalltalka, Eiffela, Ade in Lispa. Projektna koda se distribuira pod licencama BSD ("2-clause BSDL") in "Ruby", ki se nanaša na najnovejšo različico licence GPL in je popolnoma združljiva z GPLv3. Ruby 2.7 je sedma večja izdaja, ki bo nastala kot del načrtovanega razvojnega procesa, ki vključuje določitev enega leta za izboljšave funkcij in 2- do 3-mesečno izdajo popravkov.

Glavni izboljšave:

  • eksperimentalno podporo ujemanje vzorcev (Ujemanje vzorcev), da ponovite dani objekt in dodelite vrednost, če obstaja ujemanje vzorca.

    primer [0, [1, 2, 3]] v [a, [b, *c]] pa #=> 0
    pb #=> 1
    pc #=> [2, 3] konec

    primer {a: 0, b: 1}
    v{a:0,x:1}
    : nedosegljiv
    v {a: 0, b: var}
    p var #=> 1
    konec

  • Lupina interaktivnih izračunov irb (REPL, Read-Eval-Print-Loop) ima zdaj možnost večvrstičnega urejanja, implementiranega s knjižnico, združljivo z readline preusmeritinapisano v Rubyju. Integrirana je podpora za rdoc, ki omogoča ogled referenčnih informacij o določenih razredih, modulih in metodah v irb. Zagotovljeno je barvno označevanje vrstic s kodo, prikazano prek Binding#irb, in rezultati pregledovanja objektov osnovnega razreda.

    Izdaja programskega jezika Ruby 2.7.0

  • Dodan kompaktni zbiralnik smeti (Compaction GC), ki lahko defragmentira območje pomnilnika, s čimer rešuje težave z zmogljivostjo in porabo pomnilnika, ki jih povzroča fragmentacija pomnilnika, do katere pride v nekaterih večnitnih aplikacijah Ruby. Za pakiranje predmetov na kup predlagano Metoda GC.compact za zmanjšanje števila uporabljenih pomnilniških strani in optimizacijo kopice za operacije
    CoW (copy-on-write).

  • Izvede priprava na ločevanje argumentov glede na položaj na seznamu ("def foo(a,b,c)") in ključne besede ("def foo(key: val)"). Samodejna pretvorba argumentov na podlagi ključnih besed in položaja je bila zastarela in ne bo podprta v veji Ruby 3.0. Zlasti je bila opuščena uporaba zadnjega argumenta kot parametrov ključne besede, posredovanje argumentov, ki temeljijo na ključnih besedah, kot zadnji parameter zgoščevanja in razdelitev zadnjega argumenta na pozicijske in ključne parametre.

    def foo(ključ: 42); konec; foo({ključ: 42}) #opozorjeno
    def foo(**kw); konec; foo({ključ: 42}) #opozorjeno
    def foo(ključ: 42); konec; foo(**{ključ: 42}) # OK
    def foo(**kw); konec; foo(**{ključ: 42}) # OK

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

    def foo(h={}, ključ: 42); konec; foo("key" => 43, key: 42) #warned
    def foo(h={}, ključ: 42); konec; foo({"key" => 43, key: 42}) # opozorilo
    def foo(h={}, ključ: 42); konec; foo({"key" => 43}, key: 42) # OK

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

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

    h = {}; def foo(*a) konec; foo(**h) # [] h = {}; def foo(a) konec; foo(**h) # {} in opozorilo
    h = {}; def foo(*a) konec; foo(h) # [{}] h = {}; def foo(a) konec; foo(h) # {}

  • Priložnost z uporabo oštevilčenih imen privzetih spremenljivk za parametre bloka.

    [1, 2, 3].each { postavi @1 } # kot [1, 2, 3].each { |i| postavi i}

  • Eksperimentalna podpora za obsege brez začetne vrednosti.

    ary[..3] # enako kot ary[0..3] rel.where(prodaja: ..100)

  • Dodana metoda Enumerable#tally, ki šteje, kolikokrat se pojavi vsak element.

    ["a", "b", "c", "b"].seštevek
    #=> {"a"=>1, "b"=>2, "c"=>1}

  • Klic zasebne metode je dovoljen z dobesednim "self".

    deffoo
    konec
    zasebno :foo
    self.foo

  • Dodana metoda Enumerator::Lazy#eager za ustvarjanje navadnega oštevilčenja iz lenega (Enumerator::Lazy) oštevilčenja.

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

  • Nadaljeval se je razvoj eksperimentalnega prevajalnika JIT, ki lahko bistveno izboljša delovanje aplikacij v jeziku Ruby. Prevajalnik JIT, predlagan v Rubyju, najprej zapiše kodo C na disk, nato pa pokliče zunanji prevajalnik C za generiranje strojnih navodil (podprti so GCC, Clang in Microsoft VC ++). Nova različica izvaja metodo za vgrajeno uvajanje, če je potrebno, selektivno uporabo načinov optimizacije med prevajanjem, privzeta vrednost "--jit-min-calls" je povečana s 5 na 10000 in "--jit-max-cache" od 1000 do 100.
  • Izboljšana zmogljivost CGI.escapeHTML, Monitor in MonitorMixin.
  • Module#name, true.to_s, false.to_s in nil.to_s zagotavljajo, da je vrnjen niz, ki je nespremenjen za navedeni objekt.
  • Velikost binarnih datotek, ustvarjenih z metodo RubyVM::InstructionSequence#to_binary;, je bila zmanjšana.
  • Posodobljene različice vgrajenih komponent, vključno z
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    Pregledovalnik nizov 1.0.3;

  • Knjižnice so se preselile iz osnovne distribucije v zunanje gem pakete
    CMath (cmath gem),
    Scanf (skenf dragulj),
    Školjka (školjčni dragulj),
    Sinhronizator (sinhronizacijski dragulj),
    ThreadsWait (thwait gem),
    E2MM (dragulj e2mmap).

  • Privzeti moduli stdlib so objavljeni na rubygems.org:
    merilo,
    cgi,
    delegat,
    getoptlong,
    net pop,
    net smtp,
    odprt3,
    pstore,
    samec. Nadzorni moduli niso premaknjeni na rubygems.org
    opazovalec,
    odmor,
    sledilnik,
    uri,
    yaml, ki so dobavljeni samo z ruby-core.

  • Gradnja Rubyja zdaj zahteva prevajalnik C, ki podpira standard C99.

Vir: opennet.ru

Dodaj komentar