Ruby 4.0.0 preview3 veröffentlicht

Veröffentlicht von naruse am 18. Dez 2025

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.

Ruby::Box

Ein neues (experimentelles) Feature zur Trennung von Definitionen. Details zu „Ruby Box“ finden Sie unter doc/language/box.md. [Feature #21311] [Misc #21385]

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, wie bei fließenden Punkten. Die folgenden beiden Codes sind gleich

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

    [Feature #20925]

Aktualisierungen der Kernklassen

Hinweis: Hier werden nur herausragende Klassenaktualisierungen aufgeführt.

  • Kernel

    • Kernel#inspect prüft nun auf die Existenz einer #instance_variables_to_inspect Methode, wodurch gesteuert werden kann, 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-Erzeugung durch Kernel#open mit einem führenden |, wurde entfernt. [Feature #19630]

  • Binding

    • Binding#local_variables schließt keine nummerierten Parameter mehr ein. Außerdem lehnen Binding#local_variable_get und Binding#local_variable_set die Handhabung von nummerierten Parametern ab. [Bug #21049]
  • File

    • File::Stat#birthtime ist nun 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-Erzeugung durch IO-Klassenmethoden mit einem führenden |, wurde entfernt. [Feature #19630]

  • Math

  • Method

    • Method#source_location, Proc#source_location und UnboundMethod#source_location geben nun erweiterte Standortinformationen mit 5 Elementen zurück: [Pfad, Startzeile, Startspalte, Endzeile, Endspalte]. Das frühere 2-Elemente-Format [Pfad, Zeile] kann immer noch durch Aufruf von .take(2) auf dem Ergebnis erhalten werden. [Feature #6012]
  • 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?

      Als Ergebnis wurden Ractor.yield und Ractor#take entfernt.

    • Ractor#join und Ractor#value wurden hinzugefügt, um auf die Beendigung eines Ractors zu warten. Diese sind ähnlich zu 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 sind, wird zurückgekehrt, wenn ein Ractor terminiert.

    • Ractor#default_port wurde hinzugefügt. Jeder Ractor hat einen Standard-Port, 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 Proc oder Lambda teilbar zu machen. [Feature #21550], [Feature #21557]

  • Range

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

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

    • Das Verhalten von Range#max bei beginnlosen Ganzzahlbereichen wurde korrigiert. [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 und keine automatisch geladene stdlib-Klasse mehr. [Feature #21216]

    • Set#inspect gibt nun einen String zurück, der für eval geeignet ist, und verwendet die Syntax Set[] (z. B. Set[1, 2, 3] anstelle von #<Set: {1, 2, 3}>). Dies macht es konsistent mit anderen Kernkollektionsklassen wie Array und Hash. [Feature #21389]

    • Die Übergabe 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 festzulegen. [Feature #21347]
  • String

  • Thread

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

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

    • Einführung von Fiber::Scheduler#fiber_interrupt, um einen Fiber mit einer gegebenen Ausnahme zu unterbrechen. Der anfängliche Anwendungsfall ist die Unterbrechung eines Fibers, der auf eine blockierende IO-Operation wartet, wenn die IO-Operation geschlossen wird. [Feature #21166]
  • Pathname

    • Pathname wurde von einem Standard-Gem zu einer Kernklasse von Ruby befördert. [Feature #17473]

Stdlib-Aktualisierungen

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

  • ostruct 0.6.3
  • pstore 0.2.0
  • benchmark 0.5.0
  • logger 1.7.0
  • rdoc 6.17.0
  • win32ole 1.9.2
  • irb 1.16.0
  • reline 0.6.3
  • readline 0.0.4
  • fiddle 1.1.8

Wir listen nur Stdlib-Änderungen auf, die bemerkenswerte Feature-Änderungen sind.

Andere Änderungen werden in den folgenden Abschnitten aufgeführt. Wir haben auch die Release-Historie ab der vorherigen gebündelten Version, Ruby 3.3.0, aufgeführt, falls sie GitHub-Releases hat.

Das folgende Standard-Gem wird hinzugefügt.

  • win32-registry 0.1.2

Die folgenden Standard-Gems werden aktualisiert.

  • RubyGems 4.0.2
  • bundler 4.0.2
  • date 3.5.1
  • digest 3.2.1
  • english 0.8.1
  • erb 6.0.1
  • etc 1.4.6
  • fcntl 1.3.0
  • fileutils 1.8.0
  • forwardable 1.4.0
  • io-console 0.8.2
  • io-nonblock 0.3.2
  • io-wait 0.4.0
  • ipaddr 1.2.8
  • json 2.18.0
  • net-http 0.9.1
  • openssl 4.0.0
  • optparse 0.8.1
  • pp 0.6.3
  • prism 1.6.0
  • psych 5.3.1
  • resolv 0.7.0
  • stringio 3.2.0
  • strscan 3.1.6
  • time 0.4.2
  • timeout 0.6.0
  • uri 1.1.1
  • weakref 0.1.4
  • zlib 3.2.2

Die folgenden gebündelten Gems werden aktualisiert.

  • minitest 5.27.0
  • power_assert 3.0.1
  • rake 13.3.1
  • test-unit 3.7.3
  • rexml 3.4.4
  • net-ftp 0.3.9
  • net-imap 0.6.1
  • net-smtp 0.5.1
  • matrix 0.4.3
  • prime 0.1.4
  • rbs 3.10.0.pre.2
  • typeprof 0.31.0
  • debug 1.11.0
  • base64 0.3.0
  • bigdecimal 4.0.1
  • drb 2.2.3
  • syslog 0.3.0
  • csv 3.3.5
  • repl_type_completor 0.1.12

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

    [Feature #21262]

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

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

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

Stdlib-Kompatibilitätsprobleme

  • Die CGI-Bibliothek wurde aus den Standard-Gems entfernt. Nun bieten wir nur noch cgi/escape für die folgenden Methoden an:

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

    [Feature #21258]

  • Mit der Überführung von Set von stdlib in eine Kernklasse wurde set/sorted_set.rb entfernt, und SortedSet ist keine automatisch geladene Konstante mehr. Bitte installieren Sie das Gem sorted_set und require 'sorted_set', um SortedSet zu verwenden. [Feature #21287]

C-API-Aktualisierungen

  • IO

    • rb_thread_fd_close ist veraltet und ist jetzt eine No-op. Wenn Sie File-Deskriptoren von C-Erweiterungen für Ruby-Code verfügbar machen 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 File-Deskriptoren unterbricht keine ausstehenden Operationen und kann zu undefiniertem Verhalten führen. Anders ausgedrückt: Wenn zwei IO-Objekte denselben File-Deskriptor teilen, hat das Schließen des einen keine Auswirkung 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 zu vermeiden. 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

Ractor

Es wurde viel Arbeit geleistet, um Ractors stabiler, performanter und nutzbarer zu machen. Diese Verbesserungen bringen die Ractor-Implementierung näher an den Austritt aus dem experimentellen Status.

  • Leistungsverbesserungen
    • Gefrorene Strings und die Symboltabelle verwenden intern eine Lock-Free-Hash-Menge.
    • Methoden-Cache-Lookups vermeiden in den meisten Fällen Sperren.
    • Zugriff auf Instanzvariablen von Klassen (und Geniv) ist schneller und vermeidet Sperren.
    • Cache-Konflikte werden bei der Objekterstellung vermieden.
    • object_id vermeidet in den meisten Fällen Sperren.
  • Fehlerbehebungen und Stabilität
    • Mögliche Deadlocks bei der Kombination von Ractors und Threads behoben.
    • Probleme mit require und autoload in einem Ractor behoben.
    • Kodierungs-/Transkodierungsprobleme über Ractors hinweg behoben.
    • Race Conditions bei GC-Operationen und Methoden-Invalidierung behoben.
    • Probleme mit Prozessen behoben, die nach dem Start eines Ractors geforkt wurden.

JIT

  • ZJIT
    • Einführung eines experimentellen methodenbasierten JIT-Compilers. Um --zjit-Unterstützung zu aktivieren, bauen Sie Ruby mit Rust 1.85.0 oder neuer.
    • 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 davon ab, es in der Produktion einzusetzen.
    • 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.

Verschiedene Änderungen

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

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

Herunterladen

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

    SIZE: 23865890
    SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c
    SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0
    SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz

    SIZE: 17915004
    SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99
    SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6
    SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip

    SIZE: 29403010
    SHA1: 689cb6c497afb96d26745708e772b63afca52e1a
    SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf
    SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
    

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

Weitere Neuigkeiten...