Ruby 4.0.0 veröffentlicht

Veröffentlicht von naruse am 25. Dez 2025

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.

Ruby Box

Ruby Box ist ein neues (experimentelles) Feature zur Trennung von Definitionen. Ruby Box wird aktiviert, wenn eine Umgebungsvariable RUBY_BOX=1 gesetzt ist. Die Klasse ist Ruby::Box.

In einer Box geladene Definitionen sind in der Box isoliert. Ruby Box kann Monkey-Patches, Änderungen an globalen/Klassenvariablen, Klassen-/Moduldefinitionen und geladene native/Ruby-Bibliotheken von anderen Boxen isolieren/trennen.

Erwartete Anwendungsfälle sind:

  • Testfälle in einer Box ausführen, um andere Tests zu schützen, wenn der Testfall Monkey-Patches verwendet, um etwas zu überschreiben
  • Web-App-Boxen parallel ausführen, um Blue-Green-Deployments auf einem App-Server in einem Ruby-Prozess durchzuführen
  • Web-App-Boxen parallel ausführen, um Abhängigkeitsaktualisierungen über einen bestimmten Zeitraum zu bewerten, indem Antwortunterschiede mithilfe von Ruby-Code überprüft werden
  • Als Grundlage (Low-Level) API verwendet werden, um eine Art „Paket“ (High-Level) API zu implementieren (diese ist noch nicht entworfen)

Für Details zu „Ruby Box“ siehe Ruby::Box. [Feature #21311] [Misc #21385]

ZJIT

ZJIT ist ein neuer Just-in-Time (JIT) Compiler, der als nächste Generation von YJIT entwickelt wird. Sie benötigen Rust 1.85.0 oder neuer, um Ruby mit ZJIT-Unterstützung zu kompilieren, und ZJIT wird aktiviert, wenn --zjit angegeben wird.

Wir entwickeln einen neuen Compiler für Ruby, da wir sowohl die Leistungsgrenze erhöhen (größere Kompilierungseinheitengröße und SSA IR) als auch mehr externe Beiträge fördern möchten (indem wir ein traditionellerer Methodencompiler werden). Lesen Sie unseren Blogbeitrag für weitere Details.

ZJIT ist schneller als der Interpreter, aber noch nicht so schnell wie YJIT. Wir ermutigen Sie, ZJIT auszuprobieren, aber vielleicht sollten Sie es vorerst nicht in der Produktion einsetzen. Bleiben Sie dran für Ruby 4.1 ZJIT.

Ractor-Verbesserungen

Ractor, Rubys Mechanismus für parallele Ausführung, hat mehrere Verbesserungen erhalten. Eine neue Klasse, Ractor::Port, wurde eingeführt, um Probleme beim Senden und Empfangen von Nachrichten zu beheben (siehe unseren Blogbeitrag). Darüber hinaus erleichtert Ractor.shareable_proc das Teilen von Proc-Objekten zwischen Ractors.

Auf der Performance-Seite wurden viele interne Datenstrukturen verbessert, um die Blockierung durch ein globales Schloss erheblich zu reduzieren und eine bessere Parallelität zu ermöglichen. Ractors teilen nun auch weniger interne Daten, was zu weniger CPU-Cache-Konflikten bei paralleler Ausführung führt.

Ractor wurde erstmals in Ruby 3.0 als experimentelles Feature eingeführt. Wir beabsichtigen, seinen „experimentellen“ Status im nächsten Jahr zu entfernen.

Sprachänderungen

  • *nil ruft nicht mehr nil.to_a auf, ähnlich wie **nil nicht nil.to_hash aufruft. [Feature #21047]

  • Logische binäre Operatoren (||, &&, and und or) am Anfang einer Zeile setzen die vorherige Zeile fort, ähnlich wie ein flüssiger Punkt. Die folgenden Codebeispiele sind gleich:

      if condition1
         && condition2
        ...
      end
    

    Zuvor

      if condition1 && condition2
        ...
      end
    
      if condition1 &&
         condition2
        ...
      end
    

    [Feature #20925]

Aktualisierungen der Kernklassen

Hinweis: Hier werden nur herausragende Klassenaktualisierungen aufgeführt.

  • Array

    • Array#rfind wurde als effizientere Alternative zu array.reverse_each.find hinzugefügt [Feature #21678]
    • Array#find wurde als effizientere Überschreibung von Enumerable#find hinzugefügt [Feature #21678]
  • Binding

    • Binding#local_variables enthält keine nummerierten Parameter mehr. Außerdem lehnen Binding#local_variable_get, Binding#local_variable_set und Binding#local_variable_defined? die Behandlung von nummerierten Parametern ab. [Bug #21049]

    • Binding#implicit_parameters, Binding#implicit_parameter_get und Binding#implicit_parameter_defined? wurden hinzugefügt, um nummerierte Parameter und den „it“-Parameter abzurufen. [Bug #21049]

  • Enumerator

    • Enumerator.produce akzeptiert jetzt ein optionales Schlüsselwortargument size, um die Größe des Enumerators anzugeben. Dies kann eine Ganzzahl, Float::INFINITY, ein aufrufbares Objekt (wie ein Lambda) oder nil sein, um die unbekannte Größe anzuzeigen. Wenn nicht angegeben, ist die Standardgröße Float::INFINITY.

        # Infinite enumerator
        enum = Enumerator.produce(1, size: Float::INFINITY, &:succ)
        enum.size  # => Float::INFINITY
      
        # Finite enumerator with known/computable size
        abs_dir = File.expand_path("./baz") # => "/foo/bar/baz"
        traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) {
          raise StopIteration if it == "/"
          File.dirname(it)
        }
        traverser.size  # => 4
      

      [Feature #21701]

  • ErrorHighlight

    • Wenn ein ArgumentError ausgelöst wird, werden nun Codeausschnitte sowohl für den Methodenaufruf (Aufrufer) als auch für die Methodendefinition (Aufgerufener) angezeigt. [Feature #21543]

      test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError)
      
          caller: test.rb:3
          | add(1)
            ^^^
          callee: test.rb:1
          | def add(x, y) = x + y
                ^^^
              from test.rb:3:in '<main>'
      
  • Fiber

    • Unterstützung für das Argument Fiber#raise(cause:) ähnlich zu Kernel#raise eingeführt. [Feature #21360]
  • Fiber::Scheduler

    • Fiber::Scheduler#fiber_interrupt eingeführt, um eine Fiber mit einer gegebenen Ausnahme zu unterbrechen. Der anfängliche Anwendungsfall ist das Unterbrechen einer Fiber, die auf eine blockierende E/A-Operation wartet, wenn die E/A-Operation geschlossen wird. [Feature #21166]

    • Fiber::Scheduler#yield eingeführt, um dem Fiber-Scheduler die Fortsetzung der Verarbeitung zu ermöglichen, wenn Signal-Ausnahmen deaktiviert sind. [Bug #21633]

    • Der Fiber::Scheduler#io_close Hook für asynchrone IO#close wieder eingeführt.

    • Fiber::Scheduler#io_write aufgerufen beim Leeren des E/A-Schreibpuffers. [Bug #21789]

  • File

    • File::Stat#birthtime ist jetzt unter Linux über den statx-Systemaufruf verfügbar, wenn vom Kernel und Dateisystem unterstützt. [Feature #21205]
  • IO

    • IO.select akzeptiert Float::INFINITY als Timeout-Argument. [Feature #20610]

    • Ein veraltetes Verhalten, die Prozess-Erstellung durch IO-Klassenmethoden mit einem führenden |, wurde entfernt. [Feature #19630]

  • Kernel

    • Kernel#inspect prüft nun auf die Existenz einer #instance_variables_to_inspect-Methode, was die Kontrolle darüber ermöglicht, welche Instanzvariablen im #inspect-String angezeigt werden

        class DatabaseConfig
          def initialize(host, user, password)
            @host = host
            @user = user
            @password = password
          end
      
          private def instance_variables_to_inspect = [:@host, :@user]
        end
      
        conf = DatabaseConfig.new("localhost", "root", "hunter2")
        conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root">
      

      [Feature #21219]

    • Ein veraltetes Verhalten, die Prozess-Erstellung durch Kernel#open mit einem führenden |, wurde entfernt. [Feature #19630]

  • Math

  • Pathname

    • Pathname wurde von einem Standardgem zu einer Kernklasse von Ruby befördert. [Feature #17473]
  • Proc

    • Proc#parameters zeigt nun anonyme optionale Parameter als [:opt] anstelle von [:opt, nil], was die Ausgabe konsistent mit dem Fall macht, wenn der anonyme Parameter erforderlich ist. [Bug #20974]
  • Ractor

    • Die Klasse Ractor::Port wurde für einen neuen Synchronisationsmechanismus zur Kommunikation zwischen Ractors hinzugefügt. [Feature #21262]

        port1 = Ractor::Port.new
        port2 = Ractor::Port.new
        Ractor.new port1, port2 do |port1, port2|
          port1 << 1
          port2 << 11
          port1 << 2
          port2 << 12
        end
        2.times{ p port1.receive } #=> 1, 2
        2.times{ p port2.receive } #=> 11, 12
      

      Ractor::Port bietet die folgenden Methoden:

      • Ractor::Port#receive
      • Ractor::Port#send (oder Ractor::Port#<<)
      • Ractor::Port#close
      • Ractor::Port#closed?

      Infolge dessen wurden Ractor.yield und Ractor#take entfernt.

    • Die Methoden Ractor#join und Ractor#value wurden hinzugefügt, um auf die Beendigung eines Ractors zu warten. Diese sind ähnlich wie Thread#join und Thread#value.

    • Ractor#monitor und Ractor#unmonitor wurden als Low-Level-Interfaces hinzugefügt, die intern zur Implementierung von Ractor#join verwendet werden.

    • Ractor.select akzeptiert nun nur noch Ractors und Ports. Wenn Ractors angegeben werden, wird zurückgegeben, wenn ein Ractor beendet wird.

    • Ractor#default_port wurde hinzugefügt. Jeder Ractor hat einen Standardport, der von Ractor.send und Ractor.receive verwendet wird.

    • Ractor#close_incoming und Ractor#close_outgoing wurden entfernt.

    • Ractor.shareable_proc und Ractor.shareable_lambda wurden eingeführt, um teilbare Proc- oder Lambda-Objekte zu erstellen. [Feature #21550], [Feature #21557]

  • Range

    • Range#to_set führt nun Größenprüfungen durch, um Probleme mit endlosen Bereichen zu vermeiden. [Bug #21654]

    • Range#overlap? behandelt nun korrekt unendliche (unbegrenzte) Bereiche. [Bug #21185]

    • Das Verhalten von Range#max bei beginnlosen ganzzahligen Bereichen wurde behoben. [Bug #21174] [Bug #21175]

  • Ruby

    • Ein neues Top-Level-Modul Ruby wurde definiert, das Ruby-bezogene Konstanten enthält. Dieses Modul wurde in Ruby 3.4 reserviert und ist nun offiziell definiert. [Feature #20884]
  • Ruby::Box

  • Set

    • Set ist nun eine Kernklasse, anstatt einer automatisch geladenen Standardbibliothek. [Feature #21216]

    • Set#inspect verwendet nun eine einfachere Anzeige, ähnlich wie literale Arrays. (z. B. Set[1, 2, 3] anstelle von #<Set: {1, 2, 3}>). [Feature #21389]

    • Das Übergeben von Argumenten an Set#to_set und Enumerable#to_set ist nun veraltet. [Feature #21390]

  • Socket

    • Socket.tcp & TCPSocket.new akzeptieren ein Schlüsselwortargument open_timeout, um das Timeout für die anfängliche Verbindung anzugeben. [Feature #21347]
    • Wenn in TCPSocket.new ein vom Benutzer angegebener Timeout auftrat, konnten zuvor entweder Errno::ETIMEDOUT oder IO::TimeoutError ausgelöst werden, abhängig von der Situation. Dieses Verhalten wurde vereinheitlicht, sodass nun konsistent IO::TimeoutError ausgelöst wird. (Bitte beachten Sie, dass in Socket.tcp weiterhin Fälle auftreten können, in denen Errno::ETIMEDOUT in ähnlichen Situationen ausgelöst wird, und dass in beiden Fällen Errno::ETIMEDOUT ausgelöst werden kann, wenn der Timeout auf Betriebssystemebene auftritt.)
  • String

  • Thread

    • Unterstützung für das Argument Thread#raise(cause:) ähnlich zu Kernel#raise eingeführt. [Feature #21360]

Aktualisierungen der Standardbibliothek

Wir listen nur bemerkenswerte Feature-Änderungen der Standardbibliothek auf.

Andere Änderungen sind in den folgenden Abschnitten aufgeführt. Wir haben auch die Releaseliste der zuvor gebündelten Version Ruby 3.4.0 aufgeführt, falls diese GitHub-Releases hat.

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

Das folgende Standard-Gem wird hinzugefügt.

  • win32-registry 0.1.2

Die folgenden Standard-Gems werden aktualisiert.

Die folgenden gebündelten Gems werden aktualisiert.

RubyGems und Bundler

Ruby 4.0 gebündelte RubyGems und Bundler Version 4. Weitere Informationen finden Sie unter den folgenden Links.

Unterstützte Plattformen

  • Windows

    • Unterstützung für MSVC-Versionen älter als 14.0 (_MSC_VER 1900) wurde eingestellt. Dies bedeutet, dass Visual Studio 2015 oder neuer jetzt erforderlich ist.

Kompatibilitätsprobleme

  • Die folgenden Methoden wurden aus Ractor entfernt, da Ractor::Port hinzugefügt wurde.

    • Ractor.yield
    • Ractor#take
    • Ractor#close_incoming
    • Ractor#close_outgoing

    [Feature #21262]

  • ObjectSpace._id2ref ist veraltet. [Feature #15408]

  • Process::Status#& und Process::Status#>> wurden entfernt. Sie waren in Ruby 3.3 veraltet. [Bug #19868]

  • rb_path_check wurde entfernt. Diese Funktion wurde für die Überprüfung von Pfaden unter $SAFE verwendet, die in Ruby 2.7 entfernt wurde, und war bereits veraltet. [Feature #20971]

  • Ein Backtrace für ArgumentError mit „falsche Anzahl von Argumenten“ enthält nun den Klassennamen oder Modulnamen des Empfängers (z. B. in Foo#bar anstelle von bar). [Bug #21698]

  • Backtraces zeigen keine internal Frames mehr an. Diese Methoden erscheinen nun so, als ob sie sich in der Ruby-Quelldatei befinden, konsistent mit anderen C-implementierten Methoden. [Bug #20968]

    Vorher

    ruby -e '[1].fetch_values(42)'
    <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError)
            from <internal:array>:211:in 'block in Array#fetch_values'
            from <internal:array>:211:in 'Array#map!'
            from <internal:array>:211:in 'Array#fetch_values'
            from -e:1:in '<main>'
    

    Nachher

    $ ruby -e '[1].fetch_values(42)'
    -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError)
            from -e:1:in '<main>'
    

Stdlib-Kompatibilitätsprobleme

  • Die CGI-Bibliothek wurde aus den Standardgems entfernt. Wir stellen nun nur noch cgi/escape für die folgenden Methoden zur Verfügung:

    • CGI.escape und CGI.unescape
    • CGI.escapeHTML und CGI.unescapeHTML
    • CGI.escapeURIComponent und CGI.unescapeURIComponent
    • CGI.escapeElement und CGI.unescapeElement

    [Feature #21258]

  • Da Set von der Standardbibliothek zu einer Kernklasse verschoben wurde, wurde set/sorted_set.rb entfernt und SortedSet ist keine automatisch geladene Konstante mehr. Bitte installieren Sie das sorted_set Gem und require 'sorted_set', um SortedSet zu verwenden. [Feature #21287]

  • Net::HTTP

    • Das Standardverhalten, automatisch den Content-Type Header auf application/x-www-form-urlencoded für Anfragen mit Body (z. B. POST, PUT) zu setzen, wenn der Header nicht explizit gesetzt war, wurde entfernt. Wenn Ihre Anwendung von diesem automatischen Standardwert abhängig war, werden Ihre Anfragen nun ohne Content-Type-Header gesendet, was die Kompatibilität mit bestimmten Servern beeinträchtigen kann. [GH-net-http #205]

C-API-Aktualisierungen

  • IO

    • rb_thread_fd_close ist veraltet und nun eine No-Op. Wenn Sie Dateideskriptoren von C-Erweiterungen an Ruby-Code übergeben müssen, erstellen Sie eine IO-Instanz mit RUBY_IO_MODE_EXTERNAL und verwenden Sie rb_io_close(io), um sie zu schließen (dies unterbricht und wartet auch auf alle ausstehenden Operationen auf der IO-Instanz). Das direkte Schließen von Dateideskriptoren unterbricht keine ausstehenden Operationen und kann zu undefiniertem Verhalten führen. Mit anderen Worten, wenn zwei IO-Objekte denselben Dateideskriptor teilen, hat das Schließen des einen keine Auswirkungen auf das andere. [Feature #18455]
  • GVL

    • rb_thread_call_with_gvl funktioniert nun mit oder ohne GVL. Dies ermöglicht es Gems, ruby_thread_has_gvl_p nicht mehr überprüfen zu müssen. Seien Sie bitte weiterhin sorgfältig mit dem GVL. [Feature #20750]
  • Set

    • Eine C-API für Set wurde hinzugefügt. Die folgenden Methoden werden unterstützt: [Feature #21459]

      • rb_set_foreach
      • rb_set_new
      • rb_set_new_capa
      • rb_set_lookup
      • rb_set_add
      • rb_set_clear
      • rb_set_delete
      • rb_set_size

Implementierungsverbesserungen

  • Class#new (z. B. Object.new) ist in allen Fällen schneller, insbesondere wenn Schlüsselwortargumente übergeben werden. Dies wurde auch in YJIT und ZJIT integriert. [Feature #21254]
  • GC-Heaps verschiedener Größen wachsen nun unabhängig voneinander, was den Speicherverbrauch reduziert, wenn nur einige Pools langlebige Objekte enthalten.
  • Die GC-Bereinigung ist auf Seiten großer Objekte schneller.
  • „Generic ivar“-Objekte (String, Array, TypedData usw.) verwenden nun ein neues internes „fields“-Objekt für einen schnelleren Zugriff auf Instanzvariablen.
  • Der GC vermeidet die Wartung einer internen id2ref-Tabelle, bis sie zum ersten Mal verwendet wird, was die Zuweisung von object_id und die GC-Bereinigung beschleunigt.
  • object_id und hash sind bei Class- und Module-Objekten schneller.
  • Größere Bignum-Integer können eingebettet bleiben, indem variable Breiten für die Allokation verwendet werden.
  • Random, Enumerator::Product, Enumerator::Chain, Addrinfo, StringScanner und einige interne Objekte sind nun schreibsperrgeschützt, was den GC-Overhead reduziert.

Ractor

Es wurde viel Arbeit geleistet, um Ractors stabiler, leistungsfähiger und nutzbarer zu machen. Diese Verbesserungen bringen die Ractor-Implementierung dem Verlassen des experimentellen Status näher.

  • Leistungsverbesserungen
    • Eingefrorene Strings und die Symboltabelle verwenden intern eine lock-freie Hash-Menge [Feature #21268]
    • Methoden-Cache-Lookups vermeiden in den meisten Fällen Sperren.
    • Der Zugriff auf Klassen- (und generische ivar-) Instanzvariablen ist schneller und vermeidet Sperren.
    • CPU-Cache-Konflikte werden bei der Objekterstellung vermieden, indem ein pro-Ractor-Zähler verwendet wird.
    • CPU-Cache-Konflikte werden in xmalloc/xfree vermieden, indem ein Thread-lokaler Zähler verwendet wird.
    • object_id vermeidet in den meisten Fällen Sperren.
  • Fehlerbehebungen und Stabilität
    • Behobene mögliche Deadlocks bei der Kombination von Ractors und Threads.
    • Behobene Probleme mit `require` und `autoload` in einem Ractor.
    • Behobene Kodierungs-/Transkodierungsprobleme über Ractors hinweg.
    • Behobene Race Conditions bei GC-Operationen und Methodeninvalidierung.
    • Behobene Probleme mit Prozessen, die nach dem Starten eines Ractors geforkt wurden.
    • Die GC-Allokationszählungen sind nun unter Ractors korrekt.
    • Behobene TracePoints, die nach GC nicht mehr funktionierten [Bug #19112]

JIT

  • ZJIT
    • Einführung eines experimentellen methodenbasierten JIT-Compilers. Wo verfügbar, kann ZJIT zur Laufzeit mit der Option --zjit oder durch Aufruf von RubyVM::ZJIT.enable aktiviert werden. Beim Erstellen von Ruby ist Rust 1.85.0 oder neuer erforderlich, um die ZJIT-Unterstützung einzuschließen.
    • Ab Ruby 4.0.0 ist ZJIT schneller als der Interpreter, aber noch nicht so schnell wie YJIT. Wir ermutigen zur Experimentation mit ZJIT, raten jedoch derzeit von der Bereitstellung in Produktionsumgebungen ab.
    • Unser Ziel ist es, ZJIT in Ruby 4.1 schneller als YJIT und produktionsreif zu machen.
  • YJIT
    • RubyVM::YJIT.runtime_stats
      • ratio_in_yjit funktioniert im Standard-Build nicht mehr. Verwenden Sie --enable-yjit=stats bei configure, um es bei --yjit-stats zu aktivieren.
      • invalidate_everything zu den Standardstatistiken hinzugefügt, die erhöht wird, wenn jeder Code durch TracePoint invalidiert wird.
    • Optionen mem_size: und call_threshold: zu RubyVM::YJIT.enable hinzugefügt.
  • RJIT
    • --rjit wurde entfernt. Wir werden die Implementierung der Drittanbieter-JIT-API in das Repository ruby/rjit verschieben.

Weitere Details finden Sie unter NEWS oder in den Commit-Logs.

Mit diesen Änderungen wurden 3889 Dateien geändert, 230769 Einfügungen (+), 297003 Löschungen (-) seit Ruby 3.4.0!

Frohe Weihnachten, ein gutes neues Jahr und frohes Hacking mit Ruby 4.0!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz

    SIZE: 23955109
    SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3
    SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271
    SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz

    SIZE: 18008368
    SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602
    SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1
    SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip

    SIZE: 29253204
    SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8
    SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455
    SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
    

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

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