NEWS für Ruby 3.4.0
Dieses Dokument listet benutzerrelevante Funktionsänderungen seit der Veröffentlichung von 3.3.0 auf, ausgenommen Fehlerkorrekturen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Sprachänderungen
-
itwurde hinzugefügt, um auf einen Blockparameter zu verweisen. [Feature #18980] -
String-Literale in Dateien ohne einfrozen_string_literal-Kommentar geben nun eine Deprecation-Warnung aus, wenn sie mutiert werden. Diese Warnungen können mit-W:deprecatedoder durch Setzen vonWarning[:deprecated] = trueaktiviert werden. Um diese Änderung zu deaktivieren, kann Ruby mit dem Kommandozeilenargument--disable-frozen-string-literalgestartet werden. [Feature #20205]-
String#+@dupliziert nun, wenn die Mutation des Strings eine Deprecation-Warnung ausgeben würde, und bietet damit eine Alternative zum Musterstr.dup if str.frozen?.
-
-
Keyword-Splatting von
nilbeim Aufrufen von Methoden wird nun unterstützt.**nilwird ähnlich wie**{}behandelt, es werden keine Schlüsselwörter übergeben und keine Konvertierungsmethoden aufgerufen. [Bug #20064] -
Blockübergabe ist bei Index-Zuweisungen nicht mehr erlaubt (z. B.
a[0, &b] = 1). [Bug #19918] -
Keyword-Argumente sind bei Index-Zuweisungen nicht mehr erlaubt (z. B.
a[0, kw: 1] = 2). [Bug #20218] -
Der Top-Level-Name
::Rubyist nun reserviert, und die Definition wird beiWarning[:deprecated]eine Warnung ausgeben. [Feature #20884]
Aktualisierungen von Kernklassen
Hinweis: Wir listen nur wichtige Klassenaktualisierungen auf.
-
-
Array#fetch_valueswurde hinzugefügt. [Feature #20702]
-
-
-
Exception#set_backtraceakzeptiert nun Arrays vonThread::Backtrace::Location.Kernel#raise,Thread#raiseundFiber#raiseakzeptieren ebenfalls dieses neue Format. [Feature #13557]
-
-
-
Ein optionaler
Fiber::Scheduler#blocking_operation_waitHook erlaubt es, blockierende Operationen aus der Event-Schleife zu verlagern, um die Latenz zu reduzieren und die Auslastung von Multi-Core-Prozessoren zu verbessern. [Feature #20876]
-
-
-
GC.configwurde hinzugefügt, um das Setzen von Konfigurationsvariablen für den Garbage Collector zu ermöglichen. [Feature #20443] -
Der GC-Konfigurationsparameter
rgengc_allow_full_markwurde eingeführt. Wenn dieserfalseist, markiert derGCnur junge Objekte. Standard isttrue. [Feature #20443]
-
-
-
Hash.newakzeptiert nun ein optionalescapacity:-Argument, um den Hash mit einer bestimmten Kapazität vorab zuzuweisen. Dies kann die Leistung beim inkrementellen Erstellen großer Hashes verbessern, indem Reallokationen und das Neu-Hashing von Schlüsseln eingespart werden. [Feature #19236]
-
-
-
IO::Buffer#copykann das GVL freigeben, sodass andere Threads beim Kopieren von Daten ausgeführt werden können. [Feature #20902]
-
-
-
Integer#**gab früherFloat::INFINITYzurück, wenn das Ergebnis groß war, gibt nun aber einenIntegerzurück. Wenn das Ergebnis extrem groß ist, wird eine Ausnahme ausgelöst. [Feature #20811]
-
-
-
MatchData#bytebeginundMatchData#byteendwurden hinzugefügt. [Feature #20576]
-
-
-
Object#singleton_methodgibt nun Methoden in Modulen zurück, die in die Singleton-Klasse des Empfängers eingefügt (prepended) oder von dort aufgenommen (included) wurden. [Bug #20620]o = Object.new o.extend(Module.new{def a = 1}) o.singleton_method(:a).call #=> 1
-
-
-
requireinRactorist erlaubt. Der aufrufende Prozess wird im Haupt-Ractorausgeführt.Ractor._require(feature)wurde hinzugefügt, um den aufrufenden Prozess im Haupt-Ractorauszuführen. [Feature #20627] -
Ractor.main?wurde hinzugefügt. [Feature #20627] -
Ractor.[]undRactor.[]=wurden hinzugefügt, um auf den ractor-lokalen Speicher des aktuellenRactorzuzugreifen. [Feature #20715] -
Ractor.store_if_absent(key){ init }wurde hinzugefügt, um ractor-lokale Variablen threadsicher zu initialisieren. [Feature #20875]
-
-
-
Range#sizelöst nun eineTypeErroraus, wenn der Bereich nicht iterierbar ist. [Misc #18984] -
Range#stephat nun konsistent eine Semantik, die mittels des+-Operators für alle Typen iteriert, nicht nur für numerische. [Feature #18368](Time.utc(2022, 2, 24)..).step(24*60*60).take(3) #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC]
-
-
-
Rational#**gab früherFloat::INFINITYoderFloat::NANzurück, wenn der Zähler des Ergebnisses groß war, gibt nun aber einenRationalzurück. Wenn er extrem groß ist, wird eine Ausnahme ausgelöst. [Feature #20811]
-
-
-
Fügt die Methode
RubyVM::AbstractSyntaxTree::Node#locationshinzu, die Ortsangaben (location objects) zurückgibt, die mit dem AST-Knoten verknüpft sind. [Feature #20624] -
Fügt die Klasse
RubyVM::AbstractSyntaxTree::Locationhinzu, die Ortsinformationen speichert. [Feature #20624]
-
-
-
String#append_as_byteswurde hinzugefügt, um einfacher und effizienter mit Binärpuffern und Protokollen zu arbeiten. Sie verkettet die Argumente direkt mit dem String ohne jegliche Encoding-Validierung oder -Konvertierung. [Feature #20594]
-
-
-
Der von
Symbol#to_szurückgegebene String gibt nun eine Deprecation-Warnung aus, wenn er mutiert wird, und wird in einer zukünftigen Ruby-Version eingefroren sein. Diese Warnungen können mit-W:deprecatedoder durch Setzen vonWarning[:deprecated] = trueaktiviert werden. [Feature #20350]
-
-
-
Unter Windows kodiert
Time#zoneden Namen der Systemzeitzone nun in UTF-8 anstelle der aktiven Codepage, falls er Nicht-ASCII-Zeichen enthält. [Bug #20929] -
Time#xmlschemaund sein AliasTime#iso8601wurden in die KernklasseTimeverschoben, während sie zuvor eine Erweiterung destime-Gems waren. [Feature #20707]
-
-
-
Fügt die Methode
Warning.categorieshinzu, die eine Liste möglicher Warnungskategorien zurückgibt. [Feature #20293]
-
Aktualisierungen der Standardbibliothek
Wir listen nur Änderungen an Standardbibliotheken auf, die bemerkenswerte Funktionsänderungen darstellen.
-
RubyGems
-
Option
--attestationzu gem push hinzugefügt. Ermöglicht das Speichern von Signaturen von Build-Artefakten auf sigstore.dev.
-
-
-
Konfiguration
lockfile_checksumshinzugefügt, um Prüfsummen in neue Lockfiles einzuschließen. -
bundle lock --add-checksumshinzugefügt, um Prüfsummen zu einem bestehenden Lockfile hinzuzufügen.
-
-
-
Leistungsverbesserungen bei
JSON.parse, ca. 1,5-mal schneller als json-2.7.x.
-
-
-
Das Keyword-Argument
anonymous: truewurde fürTempfile.createimplementiert.Tempfile.create(anonymous: true)entfernt die erstellte temporäre Datei sofort. Anwendungen müssen die Datei also nicht selbst entfernen. [Feature #20497]
-
-
win32/sspi.rb
-
Diese Bibliothek wurde aus dem Ruby-Repository nach ruby/net-http-sspi extrahiert. [Feature #20775]
-
-
-
Socket::ResolutionErrorundSocket::ResolutionError#error_codewurden hinzugefügt. [Feature #20018]
-
-
IRB
-
Interaktive Methodenvervollständigung ist nun standardmäßig mit Typinformationen verbessert. [Feature #20778]
-
Weitere Änderungen sind in den folgenden Abschnitten aufgeführt. Wir listen auch die Release-Historie ab der vorherigen gebündelten Version Ruby 3.3.0 auf, falls diese GitHub Releases hat.
Das folgende Standard-Gem wurde hinzugefügt.
-
win32-registry 0.1.0
Die folgenden Standard-Gems wurden aktualisiert.
-
RubyGems 3.6.2
-
benchmark 0.4.0
-
bundler 2.6.2
-
date 3.4.1
-
delegate 0.4.0
-
did_you_mean 2.0.0
-
digest 3.2.0
-
erb 4.0.4
-
error_highlight 0.7.0
-
etc 1.4.5
-
fcntl 1.2.0
-
fiddle 1.1.6
-
fileutils 1.7.3
-
io-console 0.8.0
-
io-nonblock 0.3.1
-
ipaddr 1.2.7
-
irb 1.14.3
-
json 2.9.1
-
logger 1.6.4
-
net-http 0.6.0
-
open-uri 0.5.0
-
openssl 3.3.0
-
optparse 0.6.0
-
ostruct 0.6.1
-
pathname 0.4.0
-
pp 0.6.2
-
prism 1.2.0
-
pstore 0.1.4
-
psych 5.2.2
-
rdoc 6.10.0
-
reline 0.6.0
-
resolv 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
shellwords 0.2.2
-
singleton 0.3.0
-
stringio 3.1.2
-
strscan 3.1.2
-
syntax_suggest 2.0.2
-
tempfile 0.3.1
-
time 0.4.1
-
timeout 0.4.3
-
tmpdir 0.3.1
-
uri 1.0.2
-
win32ole 1.9.1
-
yaml 0.4.0
-
zlib 3.2.1
-
benchmark 0.4.0
-
0.3.0 bis v0.4.0
-
-
bundler 2.6.2
-
date 3.4.1
-
delegate 0.4.0
-
0.3.1 bis v0.4.0
-
-
did_you_mean 2.0.0
-
1.6.3 bis v2.0.0
-
-
digest 3.2.0
-
3.1.1 bis v3.2.0.pre0, v3.2.0
-
-
erb 4.0.4
-
4.0.3 bis v4.0.4
-
-
error_highlight 0.7.0
-
0.6.0 bis [v0.7.0]
-
-
etc 1.4.5
-
fcntl 1.2.0
-
1.1.0 bis v1.2.0
-
-
fiddle 1.1.6
-
fileutils 1.7.3
-
1.7.2 bis v1.7.3
-
-
io-console 0.8.0
-
0.7.1 bis v0.7.2, v0.8.0.beta1, v0.8.0
-
-
io-nonblock 0.3.1
-
0.3.0 bis v0.3.1
-
-
ipaddr 1.2.7
-
1.2.6 bis v1.2.7
-
-
irb 1.14.3
-
json 2.9.1
-
logger 1.6.4
-
net-http 0.6.0
-
open-uri 0.5.0
-
0.4.1 bis v0.5.0
-
-
optparse 0.6.0
-
ostruct 0.6.1
-
0.6.0 bis v0.6.1
-
-
Pfadname 0.4.0
-
0.3.0 bis v0.4.0
-
-
pp 0.6.2
-
prism 1.2.0
-
pstore 0.1.4
-
0.1.3 bis v0.1.4
-
-
psych 5.2.2
-
5.1.2 bis v5.2.0.beta1, v5.2.0.beta2, v5.2.0.beta3, v5.2.0.beta4, v5.2.0.beta5, v5.2.0.beta6, v5.2.0.beta7, v5.2.0, v5.2.1, v5.2.2
-
-
rdoc 6.10.0
-
reline 0.6.0
-
resolv 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
1.1.0 bis v1.1.1
-
-
shellwords 0.2.2
-
singleton 0.3.0
-
0.2.0 bis v0.3.0
-
-
stringio 3.1.2
-
strscan 3.1.2
-
syntax_suggest 2.0.2
-
tempfile 0.3.1
-
time 0.4.1
-
timeout 0.4.3
-
tmpdir 0.3.1
-
uri 1.0.2
-
win32ole 1.9.1
-
yaml 0.4.0
-
0.3.0 bis v0.4.0
-
-
zlib 3.2.1
Der folgende gebündelte Gem wurde hinzugefügt.
-
repl_type_completor 0.1.9
Die folgenden gebündelten Gems wurden aktualisiert.
-
minitest 5.25.4
-
5.20.0 bis v5.25.4
-
-
power_assert 2.0.5
-
rake 13.2.1
-
test-unit 3.6.7
-
rexml 3.4.0
-
rss 0.3.1
-
0.3.0 bis 0.3.1
-
-
net-ftp 0.3.8
-
net-imap 0.5.4
-
net-smtp 0.5.0
-
prime 0.1.3
-
0.1.2 bis v0.1.3
-
-
rbs 3.8.0
-
3.4.0 bis v3.4.1, v3.4.2, v3.4.3, v3.4.4, v3.5.0.pre.1, v3.5.0.pre.2, v3.5.0, v3.5.1, v3.5.2, v3.5.3, v3.6.0.dev.1, v3.6.0.pre.1, v3.6.0.pre.2, v3.6.0, v3.6.1, v3.7.0.dev.1, v3.7.0.pre.1, v3.7.0, v3.8.0.pre.1 v3.8.0
-
-
typeprof 0.30.1
-
0.21.9 bis v0.30.1
-
-
debug 1.10.0
-
racc 1.8.1
Die folgenden gebündelten Gems werden von Default-Gems befördert.
-
mutex_m 0.3.0
-
0.2.0 bis v0.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
-
2.2.0 bis v2.2.1
-
-
nkf 0.2.0
-
0.1.3 bis v0.2.0
-
-
syslog 0.2.0
-
0.1.2 bis v0.2.0
-
-
csv 3.3.2
Unterstützte Plattformen
Kompatibilitätsprobleme
-
Fehlermeldungen und Rückverfolgungsausgaben (backtrace displays) wurden geändert.
-
Verwendet ein einzelnes Anführungszeichen anstelle eines Backticks als öffnendes Zitat. [Feature #16495]
-
Zeigt einen Klassennamen vor einem Methodennamen an (nur wenn die Klasse einen permanenten Namen hat). [Feature #19117]
-
Zusätzliche
rescue/ensureFrames sind in der Rückverfolgung (backtrace) nicht mehr verfügbar. [Feature #20275] -
Kernel#caller, die Methoden vonThread::Backtrace::Locationusw. 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>'Neu
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>'
-
-
Die Darstellung von
Hash#inspectwurde geändert. [Bug #20433]-
Symbol-Schlüssel werden mit der modernen Symbol-Schlüsselsyntax angezeigt:"{user: 1}" -
Andere Schlüssel haben nun Leerzeichen um
=>:'{"user" => 1}', während sie vorher keine hatten:'{"user"=>1}'
-
-
Kernel#Float()akzeptiert nun einen Dezimalstring, bei dem der Dezimalteil weggelassen wurde. [Feature #20705]Float("1.") #=> 1.0 (previously, an ArgumentError was raised) Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
-
String#to_fakzeptiert nun einen Dezimalstring, bei dem der Dezimalteil weggelassen wurde. [Feature #20705] Beachten Sie, dass sich das Ergebnis ändert, wenn ein Exponent angegeben wird."1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
-
Refinement#refined_classwurde entfernt. [Feature #19714]
Kompatibilitätsprobleme der Standardbibliothek
-
-
DidYouMean::SPELL_CHECKERS[]=undDidYouMean::SPELL_CHECKERS.merge!wurden entfernt.
-
-
-
Folgende Deprecated 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 deprecated.
-
-
-
Negative Werte für
Timeout.timeoutwerden abgelehnt. [Bug #20795]
-
-
-
Der Standardparser wurde von RFC 2396 konform auf RFC 3986 konform umgestellt. [Bug #19266]
-
Updates der C-API
-
rb_newobjundrb_newobj_of(und entsprechende MakrosRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF) wurden entfernt. [Feature #20265] -
Deprecated Funktion
rb_gc_force_recycleentfernt. [Feature #18290]
Implementierungsverbesserungen
-
Der Standardparser ist nun
Prism. Um den konventionellen Parser zu verwenden, nutzen Sie das Kommandozeilenargument--parser=parse.y. [Feature #20564] -
Happy Eyeballs Version 2 (RFC8305), ein Algorithmus, der schnellere und zuverlässigere Verbindungen sicherstellt, indem IPv6 und IPv4 gleichzeitig versucht werden, wird in
Socket.tcpundTCPSocket.newverwendet. Um dies global zu deaktivieren, setzen Sie die UmgebungsvariableRUBY_TCP_NO_FAST_FALLBACK=1oder rufen SieSocket.tcp_fast_fallback=falseauf. Oder um es pro Methode zu deaktivieren, verwenden Sie das Keyword-Argumentfast_fallback: false. [Feature #20108] [Feature #20782] -
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 UmgebungsvariableRUBY_GC_LIBRARYgeladen werden. [Feature #20351] -
Rubys integrierter Garbage Collector wurde in eine separate Datei unter
gc/default/default.caufgeteilt und interagiert mit Ruby über eine ingc/gc_impl.hdefinierte API. Der integrierte Garbage Collector kann nun auch als Bibliothek mitmake modular-gc MODULAR_GC=defaultgebaut und über die UmgebungsvariableRUBY_GC_LIBRARY=defaultaktiviert werden. [Feature #20470] -
Eine experimentelle
GC-Bibliothek, basierend auf MMTk, wird bereitgestellt. DieseGC-Bibliothek kann mitmake modular-gc MODULAR_GC=mmtkgebaut und über die UmgebungsvariableRUBY_GC_LIBRARY=mmtkaktiviert werden. Dies erfordert die Rust-Toolchain auf dem Build-Computer. [Feature #20860]
YJIT
Neue Funktionen
-
Kommandozeilenoptionen
-
--yjit-mem-sizeführt ein einheitliches Speicherlimit (Standard 128MiB) ein, um die gesamte YJIT-Speichernutzung zu verfolgen, was eine intuitivere Alternative zur alten Option--yjit-exec-mem-sizedarstellt. -
--yjit-trace-exits=COUNTERermöglicht das Tracen von gezählten Ausgängen und Fallbacks. -
--yjit-perf=codegenermöglicht das Profiling von JIT-Code basierend auf YJITs Codegen-Funktionen. -
--yjit-logaktiviert ein Kompilierungslog, um zu verfolgen, was kompiliert wird.
-
-
Ruby API
-
RubyVM::YJIT.enable(log: true)aktiviert ebenfalls ein Kompilierungslog. -
RubyVM::YJIT.logbietet zur Laufzeit Zugriff auf das Ende des Kompilierungslogs.
-
-
YJIT-Statistiken
-
RubyVM::YJIT.runtime_statsliefert nun immer zusätzliche Statistiken zu Invalidierung, Inlining und Metadatenkodierung. -
RubyVM::YJIT.runtime_stats[:iseq_calls]wurde hinzugefügt, um nicht-inlinierte Ruby-Methodenaufrufe zu profilieren. -
RubyVM::YJIT.runtime_stats[:cfunc_calls]wird für bessere Leistung auf die Top-20-Einträge gekürzt.
-
Neue Optimierungen
-
Komprimierter Kontext reduziert den Speicherbedarf zur Speicherung von YJIT-Metadaten
-
Zuweisung von Registern für lokale Variablen und Ruby-Methodenargumente
-
Wenn YJIT aktiviert ist, werden mehr Core-Primitive in Ruby verwendet
-
Array#each,Array#select,Array#mapwurden in Ruby für bessere Leistung neu geschrieben [Feature #20182].
-
-
Möglichkeit, kleine/triviale Methoden wie folgt zu inlinen:
-
Leere Methoden
-
Methoden, die eine Konstante zurückgeben
-
Methoden, die
selfzurückgeben -
Methoden, die direkt ein Argument zurückgeben
-
-
Spezialisierte Codegenerierung für viele weitere Laufzeitmethoden
-
Optimierung von
String#getbyte,String#setbyteund anderen String-Methoden -
Optimierung von bitweisen Operationen zur Beschleunigung von Low-Level-Bit-/Byte-Manipulationen
-
Unterstützung für teilbare Konstanten im Multi-Ractor-Modus
-
Verschiedene weitere inkrementelle Optimierungen
Sonstige Änderungen
-
Das Übergeben eines Blocks an eine Methode, die den übergebenen Block nicht verwendet, gibt im ausführlichen Modus (
-w) eine Warnung aus. In Verbindung damit wurde eine neue Warnungskategoriestrict_unused_blockeingeführt. Aktivieren Sie diese mit-W:strict_unused_blockoderWarning[:strict_unused_block] = true. [Feature #15554] -
Das Redefinieren einiger Kernmethoden, die vom Interpreter und JIT speziell optimiert werden, wie z. B.
String#freezeoderInteger#+, gibt nun eine Performance-Klassen-Warnung aus (-W:performanceoderWarning[:performance] = true). [Feature #20429]