Ruby 2.7.0-rc2 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 2.7.0-rc2 bekannt geben zu können.

Ein Veröffentlichungskandidat wird veröffentlicht, um bis zur geplanten finalen Freigabe am 25. Dezember Erfahrungsberichte sammeln zu können.

Daneben enthält sie eine Anzahl neuer Funktionalitäten und Performanzverbesserungen, namentlich:

  • Musterabgleiche
  • Verbesserungen der interaktiven Kommandozeile (REPL)
  • Defragmentierung für den GC (Campaction GC)
  • Trennung der Positions- und der Schlüsselwortargumente

Musterabgleiche [Experimentell]

Musterabgleiche sind eine häufig genutzte Funktion funktionaler Programmiersprachen. Mit 2.7.0 werden sie als experimentell in die Programmiersprache Ruby eingeführt. #14912

Ein Musterabgleich untersucht das übergebene Objekt und weist seinen Wert dann zu, wenn er auf ein bestimmtes Muster passt.

require "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

Weitere Details können Sie der Präsentation Musterabgleiche - Neue Funktion in Ruby 2.7 entnehmen.

Verbesserung der interaktiven Kommandozeile

Die mitgelieferte interaktive Kommandozeile irb (REPL: Read-Eval-Print-Loop) wird mehrzeiliges Editieren unterstützen. Dies wird mithilfe von reline, einer readline-kompatiblen nur mit Ruby implementierten Bibliothek, umgesetzt. Darüber hinaus wird irb besser mit RDoc integriert: es wird möglich, die Referenzdokumentation für eine bestimmte Klasse, ein bestimmtes Modul oder auch eine bestimmte Methode nachzuschlagen. [Feature #14683], [Feature #14787], [Feature #14918]

Schließlich werden von Binding.irb angezeigte Quellcode-Zeilen und Ergebnisse von inspect farblich hevorgehoben werden.

Defragmentierender GC

Die neue Version wird einen defragmentierenden GC (Compaction GC) einführen, der fragmentierten Arbeitsspeicherplatz defragmentieren kann.

Einige Ruby-Programme, die mit mehreren Threads arbeiten, leiden derzeit unter Speicherfragmentierung. Dies verursacht einen hohen Speicherverbrauch und eine reduzierte Ausführungsgeschwindigkeit.

Zur Behebung des Problems wird die neue Methode GC.compact eingeführt. Sie defragmentiert den Freispeicher (Heap), indem sie noch aktive Objekte näher zusammenrückt, sodass weniger Speicherseiten benötigt werden und der Freispeicher insgesamt besser für Copy-on-Write (CoW) geeignet ist. #15626

Trennung von Positions- und Schlüsselwortargumenten

Die automatische Konvertierung zwischen Schlüsselwort- und Positionsargumenten gilt nun als veraltet und wird mit Ruby 3 entfernt werden. [Feature #14183]

  • Wenn bei einem Methodenaufruf ein Hash als letztes Argument übergeben wird, wenn sonstige Argumente fehlen und wenn die aufgerufene Methode Schlüsselwortargumente annimmt, dann gibt Ruby eine Warnung aus. Um das Hash weiterhin als Schlüsselwortargument zu verwenden, ist es notwendig, den doppelten Auflösungsoperator (double splat operator) zu benutzen. Nur so kann die Warnung vermieden und das korrekte Verhalten in Ruby 3 sichergestellt werden.

    def foo(key: 42); end; foo({key: 42})   # Warnung
    def foo(**kw);    end; foo({key: 42})   # Warnung
    def foo(key: 42); end; foo(**{key: 42}) # OK
    def foo(**kw);    end; foo(**{key: 42}) # OK
    
  • Wenn bei einem Methodenaufruf Schlüsselwortargumente an eine Methode, die auch Schlüsselwortargumente akzeptiert, übergeben werden, jedoch nicht genügend Schlüsselwortargumente bereitgestellt werden, dann werden die übergebenen Schlüsselwortargumente als finales erforderliches Positionsargument gewertet und eine Warnung wird ausgegeben. Übergeben Sie das Argument als Hash statt als Schlüsselwortargumentliste, um die Warnung zu vermeiden und korrektes Verhalten in Ruby 3 sicherzustellen.

    def foo(h, **kw); end; foo(key: 42)      # Warnung
    def foo(h, key: 42); end; foo(key: 42)   # Warnung
    def foo(h, **kw); end; foo({key: 42})    # OK
    def foo(h, key: 42); end; foo({key: 42}) # OK
    
  • Wenn eine Methode bestimmte Schlüsselwortargumente, nicht aber den doppelten Auflösungsoperator verwendet, und ein Hash oder eine Schlüsselwortargumenteliste mit einer Mischung aus Strings und Symbolen übergeben wird, dann wird das Hash weiterhin aufgespalten. Zudem wird eine Warnung ausgegeben. Sie müssen für das korrekte Verhalten in Ruby 3 den aufrufenden Code so ändern, dass zwei einzelne Hashes übergeben werden.

    def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # Warnung
    def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # Warnung
    def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
    
  • Wenn eine Methode keine Schlüsselwortargumente akzeptiert, aber mit solchen aufgerufen wird, werden solche Schlüsselwortargumente weiterhin ohne Warnung als Hash für ein Positionsargument interpretiert. Dieses Verhalten wird auch in Ruby 3 weiterhin beibehalten.

    def foo(opt={});  end; foo( key: 42 )   # OK
    
  • Schlüsselwortargumente mit anderen Schlüsseln als Symbolen sind zulässig, wenn die Methode beliebige Schlüsselwortargumente akzeptiert. [Feature #14183]

    def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
    
  • **nil kann genutzt werden, um in einer Methodendefinition ausdrücklich festzulegen, dass die Methode keine Schlüsselwörter akzeptiert. Der Aufruf einer solchen Methode mit Schlüsselwortargumenten erzeugt einen ArgumentError. [Feature #14183]

    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
    
  • Die Übergabe einess leeren doppelten Auflösungsoperators an eine Methode, die keine Schlüsselwortargumente akzeptiert, führt nicht länger zur impliziten Übergabe eines leeren Hashes, es sei denn, das Hash ist wegen eines erforderlichen Parameters notwendig. In diesem Fall wird eine Warnung ausgegeben. Entfernen Sie den doppelten Auflösungsoperator, um ein Hash als Positionsargument zu übergeben. [Feature #14183]

    h = {}; def foo(*a) a end; foo(**h) # []
    h = {}; def foo(a) a end; foo(**h)  # {} und Warnung
    h = {}; def foo(*a) a end; foo(h)   # [{}]
    h = {}; def foo(a) a end; foo(h)    # {}
    

HINWEIS: Es ist darauf hingewiesen worden, dass die vielen Warnungen über die Inkompatibilitäten von Schlüsselwortargumenten störend sind. Derzeit werden zwei mögliche Lösungen diskutiert: die standardmäßige Abschaltung von Veraltungs-Warnungen (#16345) und das Unterdrücken doppelter Warnungen (#16289). Hierüber ist noch nicht abschließend entschieden worden. Dies wird jedoch bis zur offiziellen Veröffentlichung nachgeholt.

Sonstige bemerkenswerte neue Funktionen

  • Ein Methoden-Referenz-Operator, .:, war als experimentelles Feature in früheren Vorschauen eingeführt worden, wurde aber wieder entfernt. [Feature #12125], [Feature #13581], [Feature #16275]

  • Blockparameter werden für abgekürzten Zugriff automatisch nummeriert (experimentell). #4475

  • Es werden anfangslose Range-Objekte eingeführt. Diese sind vielleicht nicht so nützlich wie endlose Range-Objekte, könnten aber für domänenspezifische Sprachen praktisch sein. #14799

    ary[..3]  # identical to ary[0..3]
    rel.where(sales: ..100)
    
  • Enumerable#tally wird hinzugefügt. Die Methode zählt das Vorkommen jedes Elements.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Es ist jetzt zulässig, eine private Methode auf dem Schlüsselwort self aufzurufen. [Feature #11297] [Feature #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Enumerator::Lazy#eager wird hinzugefügt. Diese Methode generiert einen nicht verzögertern Enumerator (non-lazy enumerator) aus einem verzögerten Enumerator (lazy enumerator). [Feature #15901]

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

Performanzverbesserungen

  • JIT [Experimentell]

    • JIT-kompilierter Code wird neu zu weniger optimiertem Code kompiliert, wenn eine Optimierungsannahme sich als falsch herausstellt.

    • Method-Inlining wird durchgeführt, wenn eine Methode als rein (pure) gilt. Diese Optimierung ist noch experimentell und zahlreiche Methoden gelten noch nicht als rein.

    • Der Standardwert von --jit-min-calls wird von 5 auf 10.000 geändert.

    • Der Standardwert von --jit-max-cache wird von 1.000 auf 100 geändert.

  • Module#name, true.to_s, false.to_s, und nil.to_s geben jetzt immer einen eingefrorenen String zurück. Der zurückgegebene String ist für das jeweilige Objekt immer derselbe. [Experimenell] [Feature #16150]

  • Die Performanz von CGI.escapeHTML wurde verbessert. GH-2226

  • Die Performanz von Monitor und MonitorMixin wurde verbessert. [Feature #16255]

Sonstige bemerkenswerte Änderungen seit 2.6

  • Einige Standardbibliotheken werden aktualisiert.
    • Bundler 2.1.0.pre.3 (Änderungen)
    • RubyGems 3.1.0.pre.3 (Änderungen)
    • CSV 3.1.2 (Neuigkeiten)
    • Racc 1.4.15
    • REXML 3.2.3 (Neuigkeiten)
    • RSS 0.2.8 (Neuigkeiten)
    • StringScanner 1.0.3
    • Es werden auch einige Bibliotheken aktualisiert, die nicht über eine eigenständige Versionsnummer verfügen.
  • Änderung von stdlib-Bibliotheken in Standard-Gems:
    • Die folgenden Standard-Gems wurden auf rubygems.org veröffentlicht:
      • benchmark
      • cgi
      • delegate
      • getoptlong
      • net-pop
      • net-smtp
      • open3
      • pstore
      • singleton
    • Die folgenden Standard-Gems werden nur mit Rubys Kern, aber noch nicht auf rubygems.org veröffentlicht:
      • monitor
      • observer
      • timeout
      • tracer
      • uri
      • yaml
  • Die Nutzung von Proc.new und proc ohne Block in einer Methode, die einen Block erwartet, führt nun zu einer Warnung.

  • Die Nutzung von lambda ohne block in einer Methode, die einen Block erwartet, erzeugt einen Fehler.

  • Die Unicode- und Emoji-Version werden von 11.0.0 auf 12.0.0 angehoben. [Feature #15321]

  • Die Unicode-Version wird auf 12.1.0 angehoben, um Unterstützung für U+32FF SQUARE ERA NAME REIWA zu erhalten. [Feature #15195]

  • Date.jisx0301, Date#jisx0301, and Date.parse unterstützen die neue japanische Ära. [Feature #15742]

  • Compiler müssen jetzt C99 unterstützen. [Misc #15347]

Siehe die NEWS oder die Commit-Logs für weitere Details.

Mit diesen Änderungen wurden 4184 Dateien geändert, 226864 Einfügungen(+), 99937 Löschungen(-) seit Ruby 2.6.0! Viel Spaß bei der Programmierung mit Ruby 2.7!

Download

  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc2.tar.bz2

    SIZE: 14686646
    SHA1: e04680f57d8b7576637eb75b8b56aceeb1806992
    SHA256: 8f94ea7ba79b6e95225fb4a7870e882081182c3d12d58c4cad2a7d2e7865cf8e
    SHA512: 9010f72bb3f33b6cd3f515531e6e05198f295bb2a8a788e3a46cdfd776a9f6176b6ba8612f07f0236a11359302d2b77fdecca1dc6be33581edbb028069397a0a
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc2.tar.gz

    SIZE: 16775053
    SHA1: 787a86023f0abe6ca9c0b31e95328725e8bb7814
    SHA256: b16cd92479e5648cc53425602e9dc6d76b18dd2cc180add2fd4c9f254646779d
    SHA512: d59910a140ea1b7ca7a64073dbbe4cbe8f11cd6fc68ea7874ca160e1a23549bd159f49f4d199002f9806e77d4426bff3aa81b62707d539e0710ece7b7ff83438
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc2.tar.xz

    SIZE: 11965624
    SHA1: 1f9f30eaf1829250931c4c465ee1c15e07452e7d
    SHA256: c90d29fba655b2dd577ff755f084e4d1fe0673cfcd888af7ff5d0b2d2f449bb7
    SHA512: dba23aada4921c98eb90d216db656833d1759c4f611d5087e2a0123d932ab1c6704dfedc0d671d2d51b4b3949ff95b6aec012481141c6fce3988a3d0bc5d18b8
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc2.zip

    SIZE: 20642713
    SHA1: e0b6f91398d55436b776d7a5eae0faaf810b1578
    SHA256: ac87c1666cc840cad26083a067bae1975d1fdb41ca1f1569903c05bca1b61174
    SHA512: 4e84b1f59b574a59b5346d30a0770e06ad81a4838813cc8789157f4e1a3fcbe7ca75bf83663c20736024760f1b0675ca288f1cee7f8a28f8918c4e43b0d09982
    

Was ist Ruby

Die Programmiersprache Ruby wurde 1993 von Yukihiro „Matz“ Matsumoto erfunden und wird heute als quelloffene Software entwickelt. Sie läuft auf verschiedenen Plattformen und wird überall auf der Welt namentlich für die Webentwicklung genutzt.