Ruby 3.4.0 veröffentlicht

Gepostet von naruse am 25 Dez 2024

Wir freuen uns, die Veröffentlichung von Ruby 3.4.0 bekannt zu geben. Ruby 3.4 fügt die Blockparameterreferenz it hinzu, ändert Prism als Standardparser, fügt Happy Eyeballs Version 2 Unterstützung zur Socket-Bibliothek hinzu, verbessert YJIT, fügt Modular GC hinzu und so weiter.

it wird eingeführt

it wird hinzugefügt, um einen Blockparameter ohne Variablennamen zu referenzieren. [Feature #18980]

ary = ["foo", "bar", "baz"]

p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]

it verhält sich weitgehend gleich wie _1. Wenn die Absicht ist, _1 nur in einem Block zu verwenden, besteht die Möglichkeit, dass auch andere nummerierte Parameter wie _2 erscheinen, was für die Leser eine zusätzliche kognitive Belastung darstellt. Daher wurde it als praktische Alias-Funktion eingeführt. Verwenden Sie it in einfachen Fällen, in denen it für sich selbst spricht, wie z. B. in Einzeilenblöcken.

Prism ist jetzt der Standard-Parser

Der Standardparser wird von parse.y auf Prism umgeschaltet. [Feature #20564]

Dies ist eine interne Verbesserung und sollte für den Benutzer kaum sichtbare Änderungen aufweisen. Sollten Sie Kompatibilitätsprobleme feststellen, melden Sie diese bitte bei uns.

Um den konventionellen Parser zu verwenden, nutzen Sie das Kommandozeilenargument --parser=parse.y.

Die Socket-Bibliothek verfügt jetzt über Happy Eyeballs Version 2 (RFC 8305)

Die Socket-Bibliothek verfügt nun über Happy Eyeballs Version 2 (RFC 8305), die neueste standardisierte Version eines weit verbreiteten Ansatzes für bessere Konnektivität in vielen Programmiersprachen, in TCPSocket.new (TCPSocket.open) und Socket.tcp. Diese Verbesserung ermöglicht es Ruby, effiziente und zuverlässige Netzwerkverbindungen bereitzustellen, die an moderne Internetumgebungen angepasst sind.

Bis Ruby 3.3 führten diese Methoden Namensauflösung und Verbindungsversuche seriell aus. Mit diesem Algorithmus arbeiten sie nun wie folgt

  1. Führt IPv6- und IPv4-Namensauflösung gleichzeitig durch
  2. Versucht Verbindungen zu den aufgelösten IP-Adressen, wobei IPv6 priorisiert wird, mit parallelen Versuchen, die in Intervallen von 250 ms gestaffelt sind
  3. Gibt die erste erfolgreiche Verbindung zurück, während andere abgebrochen werden

Dies gewährleistet minimierte Verbindungsverzögerungen, auch wenn ein bestimmtes Protokoll oder eine IP-Adresse verzögert oder nicht verfügbar ist. Diese Funktion ist standardmäßig aktiviert, sodass keine zusätzliche Konfiguration erforderlich ist. Um sie global zu deaktivieren, setzen Sie die Umgebungsvariable RUBY_TCP_NO_FAST_FALLBACK=1 oder rufen Sie Socket.tcp_fast_fallback=false auf. Oder um sie pro Methode zu deaktivieren, verwenden Sie das Schlüsselwortargument fast_fallback: false.

YJIT

Kurz gesagt

  • Bessere Leistung bei den meisten Benchmarks sowohl auf x86-64- als auch auf arm64-Plattformen.
  • Reduzierter Speicherverbrauch durch komprimierte Metadaten und ein einheitliches Speicherlimit.
  • Verschiedene Fehlerbehebungen: YJIT ist jetzt robuster und gründlicher getestet.

Neue Funktionen

  • Kommandozeilenoptionen
    • --yjit-mem-size führt ein einheitliches Speicherlimit (standardmäßig 128 MiB) ein, um den gesamten YJIT-Speicherverbrauch zu verfolgen. Dies ist eine intuitivere Alternative zur alten Option --yjit-exec-mem-size.
    • --yjit-log aktiviert ein Kompilierungslog, um zu verfolgen, was kompiliert wird.
  • Ruby API
    • RubyVM::YJIT.log ermöglicht den Zugriff auf das Ende des Kompilierungslogs zur Laufzeit.
  • YJIT-Statistiken
    • RubyVM::YJIT.runtime_stats liefert nun immer zusätzliche Statistiken zu Invalidierungen, Inlining und Metadatenkodierung.

Neue Optimierungen

  • Komprimierter Kontext reduziert den benötigten Speicher für YJIT-Metadaten
  • Register für lokale Variablen und Ruby-Methodenargumente zuweisen
  • Wenn YJIT aktiviert ist, werden mehr Core-Primitive verwendet, die in Ruby geschrieben sind
    • Array#each, Array#select, Array#map in Ruby neu geschrieben für bessere Leistung [Feature #20182].
  • Fähigkeit, kleine/triviale Methoden einzubetten, wie z. B.
    • Leere Methoden
    • Methoden, die eine Konstante zurückgeben
    • Methoden, die self zurückgeben
    • Methoden, die direkt ein Argument zurückgeben
  • Spezialisierte Codegenerierung für viele weitere Laufzeitmethoden
  • Optimieren von String#getbyte, String#setbyte und anderen String-Methoden
  • Optimieren von bitweisen Operationen zur Beschleunigung von Low-Level-Bit-/Byte-Manipulationen
  • Unterstützung für teilbare Konstanten im Multi-Ractor-Modus
  • Diverse weitere inkrementelle Optimierungen

Modulare GC

  • Alternative Garbage-Collector (GC)-Implementierungen können über die modulare Garbage-Collector-Funktion dynamisch geladen werden. Um diese Funktion zu aktivieren, konfigurieren Sie Ruby zur Build-Zeit mit --with-modular-gc. GC-Bibliotheken können zur Laufzeit über die Umgebungsvariable RUBY_GC_LIBRARY geladen werden. [Feature #20351]

  • Rubys integrierter Garbage Collector wurde in eine separate Datei unter gc/default/default.c aufgeteilt und interagiert mit Ruby über eine in gc/gc_impl.h definierte API. Der integrierte Garbage Collector kann nun auch als Bibliothek mit make modular-gc MODULAR_GC=default gebaut und über die Umgebungsvariable RUBY_GC_LIBRARY=default aktiviert werden. [Feature #20470]

  • Es wird eine experimentelle GC-Bibliothek auf Basis von MMTk bereitgestellt. Diese GC-Bibliothek kann mit make modular-gc MODULAR_GC=mmtk gebaut und über die Umgebungsvariable RUBY_GC_LIBRARY=mmtk aktiviert werden. Dies erfordert die Rust-Toolchain auf dem Build-Rechner. [Feature #20860]

Sprachänderungen

  • String-Literale in Dateien ohne frozen_string_literal Kommentar geben nun eine Deprecation-Warnung aus, wenn sie mutiert werden. Diese Warnungen können mit -W:deprecated oder durch Setzen von Warning[:deprecated] = true aktiviert werden. Um diese Änderung zu deaktivieren, können Sie Ruby mit dem Kommandozeilenargument --disable-frozen-string-literal ausführen. [Feature #20205]

  • Keyword-Splatting mit nil beim Aufrufen von Methoden wird nun unterstützt. **nil wird ähnlich wie **{} behandelt, es werden keine Schlüsselwörter übergeben und keine Konvertierungsmethoden aufgerufen. [Bug #20064]

  • Blockübergabe ist im Index nicht mehr erlaubt. [Bug #19918]

  • Keyword-Argumente sind im Index nicht mehr erlaubt. [Bug #20218]

  • Der Toplevel-Name ::Ruby ist nun reserviert, und die Definition wird bei Warning[:deprecated] gewarnt. [Feature #20884]

Aktualisierungen der Kernklassen

Hinweis: Wir listen nur bemerkenswerte Updates von Core-Klassen auf.

  • Ausnahme

    • Exception#set_backtrace akzeptiert nun ein Array von Thread::Backtrace::Location. Kernel#raise, Thread#raise und Fiber#raise akzeptieren ebenfalls dieses neue Format. [Feature #13557]
  • GC

    • GC.config wurde hinzugefügt, um Konfigurationsvariablen für den Garbage Collector festlegen zu können. [Feature #20443]

    • Der GC-Konfigurationsparameter rgengc_allow_full_mark wurde eingeführt. Wenn false ist, markiert der GC nur junge Objekte. Standard ist true. [Feature #20443]

  • Ractor

    • require in Ractor ist erlaubt. Der Anforderungsprozess wird im Haupt-Ractor ausgeführt. Ractor._require(feature) wurde hinzugefügt, um den Anforderungsprozess im Haupt-Ractor auszuführen. [Feature #20627]

    • Ractor.main? wurde hinzugefügt. [Feature #20627]

    • Ractor.[] und Ractor.[]= wurden hinzugefügt, um auf den Ractor-lokalen Speicher des aktuellen Ractors zuzugreifen. [Feature #20715]

    • Ractor.store_if_absent(key){ init } wurde hinzugefügt, um Ractor-lokale Variablen threadsicher zu initialisieren. [Feature #20875]

  • Range

    • Range#size löst nun TypeError aus, wenn der Bereich nicht iterierbar ist. [Misc #18984]

Updates der Standardbibliothek

Hinweis: Wir listen nur bemerkenswerte Aktualisierungen von Standardbibliotheken auf.

  • RubyGems
    • Option --attestation zum Gem-Push hinzugefügt. Dies ermöglichte die Speicherung der Signatur auf sigstore.dev
  • Bundler
    • Konfiguration lockfile_checksums hinzugefügt, um Prüfsummen in frische Lockfiles aufzunehmen
    • Bundle-Lock --add-checksums hinzugefügt, um Prüfsummen zu einer vorhandenen Lockfile hinzuzufügen
  • JSON

    • Leistungsverbesserungen bei JSON.parse, etwa 1,5-mal schneller als json-2.7.x.
  • Tempfile

    • Das Schlüsselwortargument anonymous: true wurde für Tempfile.create implementiert. Tempfile.create(anonymous: true) entfernt die erstellte temporäre Datei sofort. Anwendungen müssen die Datei also nicht löschen. [Feature #20497]
  • win32/sspi.rb

Die folgenden gebündelten Gems werden von Standard-Gems befördert.

  • mutex_m 0.3.0
  • getoptlong 0.2.1
  • base64 0.2.0
  • bigdecimal 3.1.8
  • observer 0.1.2
  • abbrev 0.1.2
  • resolv-replace 0.1.1
  • rinda 0.2.0
  • drb 2.2.1
  • nkf 0.2.0
  • syslog 0.2.0
  • csv 3.3.2
  • repl_type_completor 0.1.9

Kompatibilitätsprobleme

Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.

  • Fehlermeldungen und Backtrace-Anzeigen wurden geändert.
    • Verwendung eines einfachen Anführungszeichens anstelle eines Backticks als öffnendes Zitat. [Feature #16495]
    • Klassenname wird vor dem Methodennamen angezeigt (nur wenn die Klasse einen permanenten Namen hat). [Feature #19117]
    • Kernel#caller, Methoden von Thread::Backtrace::Location usw. wurden ebenfalls entsprechend geändert.
    Old:
    test.rb:1:in `foo': undefined method `time' for an instance of Integer
            from test.rb:2:in `<main>'
    
    New:
    test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
            from test.rb:2:in '<main>'
    
  • Die Darstellung von Hash#inspect wurde geändert. [Bug #20433]

    • Symbol-Schlüssel werden mit der modernen Symbolschlüssel-Syntax angezeigt: "{user: 1}"
    • Andere Schlüssel haben nun Leerzeichen um =>: '{"user" => 1}', während sie vorher keine hatten: '{"user"=>1}'
  • Kernel#Float() akzeptiert jetzt einen Dezimalstring, bei dem der Dezimalteil weggelassen wird. [Feature #20705]

    Float("1.")    #=> 1.0 (previously, an ArgumentError was raised)
    Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
    
  • String#to_f akzeptiert jetzt einen Dezimalstring, bei dem der Dezimalteil weggelassen wird. Beachten Sie, dass sich das Ergebnis ändert, wenn ein Exponent angegeben wird. [Feature #20705]

    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
    
  • Refinement#refined_class wurde entfernt. [Feature #19714]

Kompatibilitätsprobleme der Standardbibliothek

  • DidYouMean

    • DidYouMean::SPELL_CHECKERS[]= und DidYouMean::SPELL_CHECKERS.merge! wurden entfernt.
  • Net::HTTP

    • Folgende veraltete Konstanten wurden entfernt
      • Net::HTTP::ProxyMod
      • Net::NetPrivate::HTTPRequest
      • Net::HTTPInformationCode
      • Net::HTTPSuccessCode
      • Net::HTTPRedirectionCode
      • Net::HTTPRetriableCode
      • Net::HTTPClientErrorCode
      • Net::HTTPFatalErrorCode
      • Net::HTTPServerErrorCode
      • Net::HTTPResponseReceiver
      • Net::HTTPResponceReceiver

      Diese Konstanten waren seit 2012 veraltet.

  • Timeout

    • Negative Werte für Timeout.timeout werden abgelehnt. [Bug #20795]
  • URI

    • Der Standardparser wurde von RFC 2396-konform auf RFC 3986-konform umgestellt. [Bug #19266]

C-API-Aktualisierungen

  • rb_newobj und rb_newobj_of (und entsprechende Makros RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) wurden entfernt. [Feature #20265]
  • Entfernte deprecated Funktion rb_gc_force_recycle. [Feature #18290]

Verschiedene Änderungen

  • Die Übergabe eines Blocks an eine Methode, die den übergebenen Block nicht verwendet, erzeugt eine Warnung im ausführlichen Modus (-w). [Feature #15554]

  • Das Neudefinieren einiger Kernmethoden, die vom Interpreter und JIT speziell optimiert werden, wie z. B. String.freeze oder Integer#+, gibt nun eine Warnung für Leistungsklassen aus (-W:performance oder Warning[:performance] = true). [Feature #20429]

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

Mit diesen Änderungen wurden 4942 Dateien geändert, 202244 Einfügungen(+), 255528 Löschungen(-) seit Ruby 3.3.0!

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

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz

    SIZE: 23153022
    SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
    SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
    SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz

    SIZE: 17215572
    SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
    SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
    SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip

    SIZE: 28310193
    SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
    SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
    SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
    

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...