Ruby

Ruby 2.7

Fedora 32 biedt Ruby 2.7 versie aan. Met deze grote update van Ruby 2.6 wordt Fedora het superieure Ruby ontwikkelplatform.

Veranderingen sinds Ruby 2.6:

Ruby 2.7 bevat verschillende nieuwe eigenschappen en prestatieverbeteringen.

Prestatieverbeteringen

  • JIT [Experimenteel]

  • De cachestrategie van Fiber is gewijzigd en het maken van fiber is versneld.

  • Module#name, true.to_s, false.to_s en nil.to_s retourneer nu altijd een bevroren String. De geretourneerde String is altijd dezelfde voor een bepaald object. [Experimenteel]

  • De prestaties van Monitor en`MonitorMixin` zijn verbeterd.

  • De prestaties van CGI.escapeHTML zijn verbeterd.

  • De Per-call-site methode cache, die sinds ongeveer 1.9 aanwezig is, is verbeterd: de cache hitratio is verhoogd van 89% naar 94%.

  • RubyVM::InstructionSequence#to_binary methode genereert een gecompileerd binair programma. De grootte hiervan is gereduceerd.

Andere opmerkelijke veranderingen

  • Enkele standaardbibliotheken zijn vernieuwd.

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

    • Sommige andere bibliotheken die geen originele versie hebben, werden ook bijgewerkt.

  • De volgende bibliotheken zijn niet langer gebundelde juwelen. Installeer overeenkomstige juwelen om deze functies te gebruiken.

    • CMath (cmath juweel)

    • Scanf (scanf juweel)

    • Shell (shell juweel)

    • Synchronizer (sync juweel)

    • ThreadsWait (thwait juweel)

    • E2MM (e2mmap juweel)

  • profile.rb is verwijderd uit de standaardbibliotheek.

  • Promoot stdlib tot standaard juwelen

    • De volgende standaard juwelen zijn gepubliceerd op rubygems.org

      • benchmark

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • De volgende standaard juwelen werden alleen gepromoot bij ruby-core, maar nog niet gepubliceerd op rubygems.org.

      • monitor

      • observer

      • timeout

      • tracer

      • uri

      • yaml

  • Proc.new en proc zonder blok in een methode aangeroepen met een blok levert nu een waarschuwing.

  • lambda zonder blok in een methode aangeroepen met een blok geeft nu een uitzondering.

  • Vernieuwt Unicode versie en Emoji versie van 11.0.0 naar 12.0.0.

  • Vernieuwt Unicode versie naar 12.1.0, ondersteuning toevoegend voor U+32FF SQUARE ERA NAME REIWA.

  • Date.jisx0301, Date#jisx0301`en `Date.parse ondersteunen het nieuwe Japanse tijdperk.

  • Vereisen compilers om C99 te ondersteunen.

Gedetailleerde veranderingen

Patroonovereenkomst [Experimenteel]

Patroonovereenkomst, een veelgebruikte functie in functionele programmeertalen, wordt geïntroduceerd als een experimentele functie. Het kan een bepaald object doorlopen en de waarde ervan toewijzen als het overeenkomt met een patroon.

vereist "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

REPL verbetering

irb, de gebundelde interactieve omgeving (REPL; Read-Eval-Print-Loop), ondersteunt nu het bewerken van meerdere regels. Het wordt aangedreven door reline, een readline compatibele bibliotheek geïmplementeerd in pure Ruby. Het biedt ook rdoc integratie. In irb kun je de referentie voor een bepaalde klasse, module of methode weergeven.

Compaction GC

Deze release introduceert Compaction GC die een gefragmenteerde geheugenruimte kan defragmenteren.

Sommige Ruby programma’s met meerdere threads kunnen geheugenfragmentatie veroorzaken, wat leidt tot een hoog geheugengebruik en een verminderde snelheid.

De GC.compact methode wordt geïntroduceerd voor het comprimeren van de heap. Deze functie comprimeert levende objecten in de heap, zodat er minder pagina’s kunnen worden gebruikt en de heap meer CoW (copy-on-write) vriendelijker is.

Scheiding van positionele en zoekwoordargumenten

Automatische conversie van zoekwoordargumenten en positionele argumenten wordt beëindigd en de conversie wordt verwijderd in Ruby 3.

Veranderingen
  • Wanneer een methode-aanroep een Hash doorgeeft bij het laatste argument, en wanneer deze geen trefwoorden doorgeeft, en wanneer de aangeroepen methode trefwoorden accepteert, wordt er een waarschuwing afgegeven. Om de hash als sleutelwoorden te blijven behandelen, voeg je een dubbele splat-operator toe om de waarschuwing te voorkomen en correct gedrag in Ruby 3 te garanderen.

        def foo(key: 42); end; foo({key: 42})   # warned
        def foo(**kw);    end; foo({key: 42})   # warned
        def foo(key: 42); end; foo(**{key: 42}) # OK
        def foo(**kw);    end; foo(**{key: 42}) # OK
  • Wanneer een methode aanroep trefwoorden doorgeeft aan een methode die trefwoorden accepteert, maar niet voldoende vereiste positionele argumenten doorgeeft, worden de trefwoorden behandeld als een laatste vereist positioneel argument en wordt er een waarschuwing afgegeven. Geef het argument door als hash in plaats van trefwoorden om de waarschuwing te vermijden en te zorgen voor correct gedrag in Ruby 3.

        def foo(h, **kw); end; foo(key: 42)      # warned
        def foo(h, key: 42); end; foo(key: 42)   # warned
        def foo(h, **kw); end; foo({key: 42})    # OK
        def foo(h, key: 42); end; foo({key: 42}) # OK
  • Wanneer een methode specifieke trefwoorden accepteert, maar geen trefwoord splat, en een hash of trefwoorden splat wordt doorgegeven aan de methode die zowel symbool- als niet-symbooltoetsen bevat, wordt de hash verder gesplitst en wordt er een waarschuwing afgegeven. Je moet de aanroepcode bijwerken om afzonderlijke hashes door te geven om correct gedrag in Ruby 3 te garanderen.

        def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # warned
        def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
        def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
  • Als een methode geen trefwoorden accepteert en wordt aangeroepen met trefwoorden, worden de trefwoorden nog steeds behandeld als een positionele hash, zonder waarschuwing. Dit gedrag blijft werken in Ruby 3.

        def foo(opt={});  end; foo( key: 42 )   # OK
  • Niet-symbolen zijn toegestaan als sleutelwoord argumentsleutels als de methode willekeurige sleutelwoorden accepteert.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • **nil is toegestaan in methodedefinities om expliciet aan te geven dat de methode geen trefwoorden accepteert. Het aanroepen van een dergelijke methode met trefwoorden resulteert in een ArgumentError.

        def foo(h, **nil); end; foo(key: 1)       # ArgumentError
        def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
        def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
        def foo(h, **nil); end; foo({key: 1})     # OK
        def foo(h, **nil); end; foo({"str" => 1}) # OK
  • Het doorgeven van een leeg trefwoord splat aan een methode die geen zoekwoorden accepteert, geeft niet langer een lege hash door, tenzij de lege hash nodig is voor een vereiste parameter, in welk geval een waarschuwing wordt afgegeven. Verwijder de dubbele splat om door een positionele hash te gaan.

        h = {}; def foo(*a) a end; foo(**h) # []
        h = {}; def foo(a) a end; foo(**h)  # {} and warning
        h = {}; def foo(*a) a end; foo(h)   # [{}]
        h = {}; def foo(a) a end; foo(h)    # {}

Als je de verouderingswaarschuwingen wilt uitschakelen, gebruik dan het commandoregelargument -W:no-deprecated of voeg Warning[:deprecated] = false toe aan je code.

Zie de upstream release aankondiging voor meer gedetailleerde informatie over deze release.

Jekyll 4.0

De *Jekyll * statische paginagenerator en zijn plug-ins zijn bijgewerkt naar versie 4.0.0. Deze versie bevat de volgende wijzigingen ten opzichte van versie 3.8:

  • Significante prestatieverbeteringen

  • Opschoningen en bugreparaties

  • Andere kleine wijzigingen niet compatibel met de vorige release

Voor meer informatie over Jekyll 4.0.0, see https://jekyllrb.com/news/2019/08/20/jekyll-4-0-0-released/.