Vrijgave van de programmeertaal Ruby 2.7.0

Na een jaar van ontwikkeling gepubliceerde релиз Ruby 2.7.0, een dynamische, objectgeoriënteerde programmeertaal die zeer efficiënt is in programmaontwikkeling en de beste eigenschappen van Perl, Java, Python, Smalltalk, Eiffel, Ada en Lisp bevat. De projectcode wordt gedistribueerd onder de BSD (“2-clausule BSDL”) en “Ruby” licenties, die verwijzen naar de nieuwste versie van de GPL-licentie en volledig compatibel zijn met GPLv3. Ruby 2.7 is de zevende grote release die moet worden voltooid als onderdeel van een gepland ontwikkelingsproces dat een jaar in beslag neemt om functionele verbeteringen voor te bereiden en elke 2-3 maanden onderhoudsreleases oplevert.

De belangrijkste verbeteringen:

  • Experimenteel ondersteunen patroonaanpassing (Patroonafstemming), waarmee u een bepaald object kunt herhalen en een waarde kunt toewijzen als er een overeenkomst is met het patroon.

    geval [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
    pb#=> 1
    pc #=> [2, 3] einde

    geval {a: 0, b: 1}
    in{a:0,x:1}
    :onbereikbaar
    in {a: 0, b: var}
    p var #=> 1
    einde

  • De shell van interactieve berekeningen irb (REPL, Read-Eval-Print-Loop) heeft nu de mogelijkheid tot bewerking op meerdere regels, geïmplementeerd met behulp van een readline-compatibele bibliotheek herlijnen, geschreven in Robijn. Ondersteuning voor rdoc is geïntegreerd, waardoor referentie-informatie over gespecificeerde klassen, modules en methoden in irb kan worden bekeken. Gekleurde markering van regels met code weergegeven via Binding#irb en resultaten van het inspecteren van basisklasseobjecten worden weergegeven.

    Vrijgave van de programmeertaal Ruby 2.7.0

  • Een compacte garbage collector (Compaction GC) toegevoegd die een geheugengebied kan defragmenteren, waardoor de problemen van trage prestaties en verhoogd geheugengebruik als gevolg van geheugenfragmentatie die optreedt tijdens de werking van sommige multi-threaded Ruby-applicaties worden opgelost. Om voorwerpen op de hoop te verpakken voorgesteld GC.compact-methode om het aantal gebruikte geheugenpagina's te verminderen en de heap voor bewerkingen te optimaliseren
    CoW (kopiëren-op-schrijven).

  • Voerde uit voorbereiden om argumenten te scheiden op basis van positie in de lijst ("def foo(a,b,c)") en trefwoorden ("def foo(key: val)"). Automatische argumentconversie op basis van trefwoorden en positie is verouderd en wordt niet ondersteund in de Ruby 3.0-vertakking. In het bijzonder is het verouderd om het laatste argument als trefwoordparameters te gebruiken, om op trefwoorden gebaseerde argumenten door te geven als de laatste hashparameter, en om het laatste argument op te splitsen in positionele parameters en trefwoordparameters.

    def foo(sleutel: 42); einde; foo({sleutel: 42}) #waarschuwde
    def foo(**kw); einde; foo({sleutel: 42}) # gewaarschuwd
    def foo(sleutel: 42); einde; foo(**{sleutel: 42}) # OK
    def foo(**kw); einde; foo(**{sleutel: 42}) # OK

    def foo(h, **kw); einde; foo(sleutel: 42) # gewaarschuwd
    def foo(h, sleutel: 42); einde; foo(sleutel: 42) # gewaarschuwd
    def foo(h, **kw); einde; foo({sleutel: 42}) # OK
    def foo(h, sleutel: 42); einde; foo({sleutel: 42}) # OK

    def foo(h={}, sleutel: 42); einde; foo("sleutel" => 43, sleutel: 42) #waarschuwing
    def foo(h={}, sleutel: 42); einde; foo({"sleutel" => 43, sleutel: 42}) # gewaarschuwd
    def foo(h={}, sleutel: 42); einde; foo({"sleutel" => 43}, sleutel: 42) # OK

    def foo(opt={}); einde; foo( sleutel: 42 ) # OK

    def foo(h, **nul); einde; foo(sleutel: 1) #ArgumentError
    def foo(h, **nul); einde; foo(**{sleutel: 1}) # ArgumentError
    def foo(h, **nul); einde; foo("str" ​​=> 1) # ArgumentError
    def foo(h, **nul); einde; foo({sleutel: 1}) # OK
    def foo(h, **nul); einde; foo({"str" ​​=> 1}) # OK

    h = {}; def foo(*a) einde; foo(**h) # [] h = {}; def foo(a) einde; foo(**h) # {} en waarschuwing
    h = {}; def foo(*a) einde; foo(h) # [{}] h = {}; def foo(a) einde; foo(h) # {}

  • Kans gebruik van genummerde standaardvariabelenamen voor blokparameters.

    [1, 2, 3].each { zet @1 } # hetzelfde als [1, 2, 3].each { |i| zet ik }

  • Experimentele ondersteuning voor bereiken zonder initiële waarde.

    ary[..3] # vergelijkbaar met ary[0..3] rel.where(verkoop: ..100)

  • De Enumerable#tally-methode toegevoegd, die telt hoe vaak elk element voorkomt.

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

  • Toegestaan ​​om een ​​privémethode aan te roepen met de letterlijke 'zelf'

    zeker foo
    einde
    privé: foe
    zelf.foo

  • Enumerator::Lazy#eager-methode toegevoegd om reguliere opsomming te genereren op basis van luie (Enumerator::Lazy) opsomming.

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

  • De ontwikkeling van een experimentele JIT-compiler is voortgezet, wat de prestaties van applicaties in de Ruby-taal aanzienlijk kan verbeteren. De JIT-compiler van Ruby schrijft eerst C-code naar schijf en roept vervolgens een externe C-compiler aan om machine-instructies te genereren (GCC-, Clang- en Microsoft VC++-aanroepen worden ondersteund). De nieuwe versie implementeert indien nodig een methode voor inline-implementatie, zorgt voor selectieve toepassing van optimalisatiemodi tijdens compilatie, de standaardwaarde van “--jit-min-calls” is verhoogd van 5 naar 10000, en “--jit-max-cache ” van 1000 tot 100 .
  • Verbeterde prestaties van CGI.escapeHTML, Monitor en MonitorMixin.
  • Module#naam, true.to_s, false.to_s en nil.to_s zorgen ervoor dat een tekenreeks wordt geretourneerd die onveranderd is voor het opgegeven object.
  • De grootte van binaire bestanden gegenereerd door de RubyVM::InstructionSequence#to_binary methode is verkleind;
  • Bijgewerkte versies van ingebouwde componenten, inclusief
    Bundelprogramma 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    Stringscanner 1.0.3;

  • Bibliotheken zijn overgestapt van de basisdistributie naar externe edelsteenpakketten
    CMath (cmath-edelsteen),
    Scanf (scanf-edelsteen),
    Schelp (schelpjuweel)
    Synchronisator (synchronisatiejuweeltje),
    ThreadsWait (thwait-edelsteen),
    E2MM (e2mmap-edelsteen).

  • De standaard stdlib-modules worden gepubliceerd op rubygems.org:
    benchmark
    cgi,
    delegeren,
    getoptlong,
    netto pop,
    netto smtp,
    open3,
    pstore,
    eenling. monitormodules niet verplaatst naar rubygems.org
    waarnemer,
    time-out,
    tracer,
    uri,
    yaml, die alleen in ruby-core worden geleverd.

  • Voor het bouwen van Ruby is nu een C-compiler vereist die de C99-standaard ondersteunt.

Bron: opennet.ru

Voeg een reactie