Ruby 2.7.0 veröffentlicht

Gepostet von naruse am 25. Dez 2019

Wir freuen uns, die Veröffentlichung von Ruby 2.7.0 bekannt zu geben.

Sie führt eine Reihe von neuen Funktionen und Leistungsverbesserungen ein, insbesondere

  • Pattern Matching
  • REPL-Verbesserung
  • Kompaktierende GC
  • Trennung von positionsbezogenen und Schlüsselwortargumenten

Pattern Matching [Experimentell]

Pattern Matching, eine weit verbreitete Funktion in funktionalen Programmiersprachen, wird als experimentelle Funktion eingeführt. [Feature #14912]

Es kann ein gegebenes Objekt durchlaufen und seinen Wert zuweisen, wenn es einem Muster entspricht.

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 finden Sie unter Pattern Matching - Neue Funktion in Ruby 2.7.

REPL-Verbesserung

irb, die integrierte interaktive Umgebung (REPL; Read-Eval-Print-Loop), unterstützt jetzt mehrzeiliges Bearbeiten. Sie wird von reline unterstützt, einer readline-kompatiblen Bibliothek, die in reinem Ruby implementiert ist. Sie bietet auch RDoc-Integration. In irb können Sie die Referenz für eine gegebene Klasse, ein Modul oder eine Methode anzeigen. [Feature #14683], [Feature #14787], [Feature #14918]

Außerdem sind Quellcodezeilen, die von Binding#irb angezeigt werden, und Inspektionsergebnisse für Core-Klassen-Objekte jetzt farbig.

Kompaktierende GC

Diese Version führt die komprimierende GC ein, die einen fragmentierten Speicherplatz defragmentieren kann.

Einige Multi-Thread-Ruby-Programme können Speicherfragmentierung verursachen, was zu hohem Speicherverbrauch und Leistungseinbußen führt.

Die Methode GC.compact wird zum Komprimieren des Heaps eingeführt. Diese Funktion komprimiert Live-Objekte im Heap, sodass weniger Seiten verwendet werden und der Heap CoW (copy-on-write) freundlicher ist. [Feature #15626]

Trennung von positionsbezogenen und Schlüsselwortargumenten

Die automatische Konvertierung von Schlüsselwortargumenten und positionsbezogenen Argumenten wird veraltet sein und in Ruby 3 entfernt. [Feature #14183]

Siehe den Artikel „Trennung von Positions- und Schlüsselwortargumenten in Ruby 3.0“ im Detail. Nur die Änderungen sind wie folgt.

  • Wenn ein Methodenaufruf einen Hash als letztes Argument übergibt, wenn keine Schlüsselwörter übergeben werden und die aufgerufene Methode Schlüsselwörter akzeptiert, wird eine Warnung ausgegeben. Um den Hash weiterhin als Schlüsselwörter zu behandeln, fügen Sie einen doppelten Sternchenoperator hinzu, um die Warnung zu vermeiden und das korrekte Verhalten in Ruby 3 sicherzustellen.

    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
    
  • Wenn ein Methodenaufruf Schlüsselwörter an eine Methode übergibt, die Schlüsselwörter akzeptiert, aber nicht genügend erforderliche positionsbezogene Argumente übergibt, werden die Schlüsselwörter als letztes erforderliches positionsbezogenes Argument behandelt und eine Warnung ausgegeben. Übergeben Sie das Argument als Hash anstelle von Schlüsselwörtern, um die Warnung zu vermeiden und das korrekte Verhalten in Ruby 3 sicherzustellen.

    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
    
  • Wenn eine Methode bestimmte Schlüsselwörter akzeptiert, aber keinen Schlüsselwort-Splat, und ein Hash oder Schlüsselwort-Splat an die Methode übergeben wird, der sowohl Symbol- als auch Nicht-Symbol-Schlüssel enthält, wird der Hash weiterhin aufgeteilt und eine Warnung ausgegeben. Sie müssen den aufrufenden Code aktualisieren, um separate Hashes zu übergeben, um das korrekte Verhalten in Ruby 3 sicherzustellen.

    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
    
  • Wenn eine Methode keine Schlüsselwörter akzeptiert und mit Schlüsselwörtern aufgerufen wird, werden die Schlüsselwörter weiterhin als positionsbezogener Hash behandelt, ohne Warnung. Dieses Verhalten wird auch in Ruby 3 weiterhin funktionieren.

    def foo(opt={});  end; foo( key: 42 )   # OK
    
  • Nicht-Symbole sind als Schlüssel von Schlüsselwortargumenten zulässig, wenn die Methode beliebige Schlüsselwörter akzeptiert. [Feature #14183]

    def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
    
  • **nil ist in Methodendefinitionen zulässig, um explizit zu kennzeichnen, dass die Methode keine Schlüsselwörter akzeptiert. Der Aufruf einer solchen Methode mit Schlüsselwörtern führt zu einem 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 eines leeren Schlüsselwort-Splats an eine Methode, die keine Schlüsselwörter akzeptiert, übergibt keinen leeren Hash mehr, es sei denn, der leere Hash ist für einen erforderlichen Parameter notwendig. In diesem Fall wird eine Warnung ausgegeben. Entfernen Sie den doppelten Sternchenoperator, um weiterhin einen positionsbezogenen Hash zu übergeben. [Feature #14183]

    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)    # {}
    

Wenn Sie die Deprecation-Warnungen deaktivieren möchten, verwenden Sie das Kommandozeilenargument -W:no-deprecated oder fügen Sie Warning[:deprecated] = false zu Ihrem Code hinzu.

Weitere bemerkenswerte neue Funktionen

  • Nummerierte Parameter als Standard-Block-Parameter werden eingeführt. [Feature #4475]

  • Ein beginnloses Intervall wird experimentell eingeführt. Es ist vielleicht nicht so nützlich wie ein endloses Intervall, aber gut für DSL-Zwecke. [Feature #14799]

    ary[..3]  # identical to ary[0..3]
    rel.where(sales: ..100)
    
  • Enumerable#tally wird hinzugefügt. Es zählt die Häufigkeit jedes Elements.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Das Aufrufen einer privaten Methode mit einem literalen self als Empfänger ist jetzt erlaubt. [Feature #11297], [Feature #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Enumerator::Lazy#eager wird hinzugefügt. Es generiert einen nicht-faulen Enumerator aus einem faulen 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!?"]
    

Leistungsverbesserungen

  • JIT [Experimentell]

    • JIT-kompilierter Code wird zu weniger optimiertem Code neu kompiliert, wenn eine Optimierungsannahme ungültig wird.

    • Methodeninlining wird durchgeführt, wenn eine Methode als rein betrachtet wird. Diese Optimierung ist noch experimentell und viele Methoden werden noch NICHT als rein betrachtet.

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

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

  • Die Cache-Strategie von Fiber wurde geändert und die Fiber-Erstellung wurde beschleunigt. GH-2224

  • 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 ein gegebenes Objekt immer derselbe. [Experimentell] [Feature #16150]

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

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

  • Der Methodencache pro Aufrufstelle, der seit etwa 1.9 existiert, wurde verbessert: Die Cache-Trefferquote stieg von 89 % auf 94 %. Siehe GH-2583

  • Die Methode RubyVM::InstructionSequence#to_binary generiert kompilierte Binärdaten. Die Binärgröße wurde reduziert. [Feature #16163]

Weitere bemerkenswerte Änderungen seit 2.6

  • Einige Standardbibliotheken wurden aktualisiert.
  • Die folgenden Bibliotheken sind keine gebündelten Gems mehr. Installieren Sie die entsprechenden Gems, um diese Funktionen zu nutzen.
    • CMath (cmath gem)
    • Scanf (scanf gem)
    • Shell (shell gem)
    • Synchronizer (sync gem)
    • ThreadsWait (thwait gem)
    • E2MM (e2mmap gem)
  • profile.rb wurde aus der Standardbibliothek entfernt.

  • Standardbibliotheken als Standard-Gems fördern
    • 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 wurden nur für ruby-core gefördert, aber noch nicht auf rubygems.org veröffentlicht.
      • monitor
      • observer
      • timeout
      • tracer
      • uri
      • yaml
  • Proc.new und proc ohne Block in einer Methode, die mit einem Block aufgerufen wird, geben jetzt eine Warnung aus.

  • Ein lambda ohne Block in einer Methode, die mit einem Block aufgerufen wird, löst eine Ausnahme aus.

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

  • Unicode-Version auf 12.1.0 aktualisiert, Hinzufügen der Unterstützung für U+32FF SQUARE ERA NAME REIWA. [Feature #15195]

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

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

Siehe NEWS oder Commit-Protokolle für weitere Details.

Mit diesen Änderungen wurden 4190 Dateien geändert, 227498 Einfügungen (+), 99979 Löschungen (-) seit Ruby 2.6.0!

Frohe Weihnachten, frohe Feiertage und viel Spaß beim Programmieren mit Ruby 2.7!

Herunterladen

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

    SIZE: 14703381
    SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af
    SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26
    SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz

    SIZE: 16799684
    SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5
    SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe
    SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz

    SIZE: 11990900
    SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d
    SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343
    SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip

    SIZE: 20571744
    SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80
    SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0
    SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b
    

Was ist Ruby

Ruby wurde erstmals 1993 von Matz (Yukihiro Matsumoto) entwickelt und wird nun als Open Source entwickelt. Es läuft auf mehreren Plattformen und wird weltweit, insbesondere für die Webentwicklung, eingesetzt.

Aktuelle Nachrichten

Ruby 4.0.0 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0 bekannt zu geben. Ruby 4.0 führt „Ruby Box“ und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 25. Dez 2025

Ein neuer Look für Rubys Dokumentation

Nach dem Redesign von ruby-lang.org gibt es weitere Neuigkeiten zur Feier des 30-jährigen Jubiläums von Ruby: docs.ruby-lang.org hat ein komplett neues Erscheinungsbild mit Aliki – dem neuen Standard-Theme von RDoc.

Veröffentlicht von Stan Lo am 23. Dez 2025

Neues Website-Erscheinungsbild

Wir freuen uns, ein umfassendes Redesign unserer Website bekannt zu geben. Das Design für dieses Update wurde von Taeko Akatsuka erstellt.

Veröffentlicht von Hiroshi SHIBATA am 22. Dez 2025

Ruby 4.0.0 preview3 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0-preview3 bekannt zu geben. Ruby 4.0 führt Ruby::Box und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 18. Dez 2025

Weitere Neuigkeiten...