NEWS für Ruby 4.0.0
Dieses Dokument listet benutzerrelevante Funktionsänderungen seit der Version 3.4.0 auf, ausgenommen Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Sprachänderungen
-
*nilruft nicht mehrnil.to_aauf, ähnlich wie**nilnichtnil.to_hashaufruft. [Feature #21047] -
Logische binäre Operatoren (
||,&&,andundor) am Anfang einer Zeile setzen die vorherige Zeile fort, wie bei fließenden Punkten. Die folgenden Codebeispiele sind gleichif condition1 && condition2 ... end
Zuvor
if condition1 && condition2 ... end
if condition1 && condition2 ... end
Aktualisierungen von Kernklassen
Hinweis: Wir listen nur wichtige Klassenaktualisierungen auf.
-
-
Array#rfindwurde als effizientere Alternative zuarray.reverse_each.findhinzugefügt [Feature #21678] -
Array#findwurde als effizientere Überschreibung vonEnumerable#findhinzugefügt [Feature #21678]
-
-
-
Binding#local_variablesschließt keine nummerierten Parameter mehr ein. Außerdem lehnenBinding#local_variable_get,Binding#local_variable_setundBinding#local_variable_defined?die Handhabung nummerierter Parameter ab. [Bug #21049] -
Binding#implicit_parameters,Binding#implicit_parameter_getundBinding#implicit_parameter_defined?wurden hinzugefügt, um nummerierte Parameter und den "it"-Parameter zu adressieren. [Bug #21049]
-
-
-
Enumerator.produceakzeptiert nun ein optionales Schlüsselwortargumentsize, um die Größe des Enumerators festzulegen. Dies kann eine Ganzzahl,Float::INFINITY, ein aufrufbares Objekt (wie ein Lambda) odernilsein, um eine unbekannte Größe anzuzeigen. Wenn nicht angegeben, beträgt die Größe standardmäßigFloat::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
-
-
-
Wenn eine
ArgumentErrorausgelö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>'“‘
-
-
-
Einführung der Unterstützung für das
Fiber#raise(cause:)-Argument, ähnlich wie beiKernel#raise. [Feature #21360]
-
-
-
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 blockierendeIO-Operation wartet, wenn dieIO-Operation geschlossen wird. [Feature #21166] -
Einführung von
Fiber::Scheduler#yield, um dem Fiber-Scheduler die Fortsetzung der Verarbeitung zu ermöglichen, wenn Signal-Ausnahmen deaktiviert sind. [Bug #21633] -
Wiederherstellung des
Fiber::Scheduler#io_closeHooks für asynchronesIO#close. -
Aufruf von
Fiber::Scheduler#io_writebeim Leeren des Schreibpuffers vonIO. [Bug #21789]
-
-
-
File::Stat#birthtimeist nun unter Linux über den statx-Systemaufruf verfügbar, wenn dies vom Kernel und Dateisystem unterstützt wird. [Feature #21205]
-
-
-
IO.selectakzeptiertFloat::INFINITYals Timeout-Argument. [Feature #20610] -
Ein als veraltet markiertes Verhalten, die Prozessgenerierung durch Klassenmethoden von
IOmit einem führenden|, wurde entfernt. [Feature #19630]
-
-
-
Kernel#inspectprüft nun auf die Existenz einer Methodeinstance_variables_to_inspect, was die Kontrolle darüber ermöglicht, welche Instanzvariablen in der Inspect-Zeichenkette angezeigt werdenclass 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">
-
Ein als veraltet markiertes Verhalten, die Prozessgenerierung durch
Kernel#openmit einem führenden|, wurde entfernt. [Feature #19630]
-
-
-
Math.log1pundMath.expm1wurden hinzugefügt. [Feature #21527]
-
-
-
Pathnamewurde von einem Standard-Gem zu einer Kernklasse von Ruby befördert. [Feature #17473]
-
-
-
Proc#parameterszeigt nun anonyme optionale Parameter als[:opt]anstelle von[:opt, nil], wodurch die Ausgabe mit der Anzeige eines erforderlichen anonymen Parameters konsistent wird. [Bug #20974]
-
-
-
Die Klasse
Ractor::Portwurde für einen neuen Synchronisationsmechanismus zur Kommunikation zwischen Raktoren 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::Portbietet die folgenden Methoden-
Ractor::Port#send(oderRactor::Port#<<)
Als Ergebnis wurden
Ractor.yieldundRactor#takeentfernt. -
Ractor#joinundRactor#valuewurden hinzugefügt, um auf die Beendigung einesRactorzu warten. Diese sind ähnlich wieThread#joinundThread#value. -
Ractor#monitorundRactor#unmonitorwurden als Low-Level-Schnittstellen hinzugefügt, die intern zur Implementierung vonRactor#joinverwendet werden. -
Ractor.selectakzeptiert nun nur noch Raktoren und Ports. Wenn Raktoren angegeben werden, wird zurückgegeben, wenn einRactorbeendet wird. -
Ractor#default_portwurde hinzugefügt. JederRactorhat einen Standard-Port, der vonRactor.send,Ractor.receiveverwendet wird. -
Ractor#close_incomingundRactor#close_outgoingwurden entfernt. -
Ractor.shareable_procundRactor.shareable_lambdawerden eingeführt, um teilbareProcoder Lambda zu erstellen. [Feature #21550], [Feature #21557]
-
-
-
Range#to_setführt nun Größenprüfungen durch, um Probleme mit endlosen Bereichen zu vermeiden. [Bug #21654] -
Range#overlap?behandelt nun korrekt unendliche (unbeschränkte) Bereiche. [Bug #21185] -
Das Verhalten von
Range#maxbei beginnlosen ganzzahligen Bereichen wurde behoben. [Bug #21174] [Bug #21175]
-
-
Ruby
-
Ein neues Toplevel-Modul
Rubywurde definiert, das Ruby-bezogene Konstanten enthält. Dieses Modul wurde in Ruby 3.4 reserviert und ist nun offiziell definiert. [Feature #20884]
-
-
-
Eine neue (experimentelle) Funktion zur Trennung von Definitionen. Details zu "Ruby Box" finden Sie unter doc/language/box.md. [Feature #21311] [Misc #21385]
-
-
Set
-
Setist nun eine Kernklasse und nicht mehr eine automatisch geladene stdlib-Klasse. [Feature #21216] -
Set#inspectverwendet nun eine einfachere Anzeige, ähnlich wie bei literalen Arrays. (z. B.Set[1, 2, 3]statt#<Set: {1, 2, 3}>). [Feature #21389] -
Die Übergabe von Argumenten an
Set#to_setundEnumerable#to_setist nun veraltet. [Feature #21390]
-
-
-
Socket.tcp&TCPSocket.newakzeptieren ein Schlüsselwortargumentopen_timeout, um das Timeout für die anfängliche Verbindung festzulegen. [Feature #21347] -
Wenn ein vom Benutzer spezifiziertes Timeout in
TCPSocket.newauftrat, konnten zuvor entwederErrno::ETIMEDOUToderIO::TimeoutErrorausgelöst werden, je nach Situation. Dieses Verhalten wurde vereinheitlicht, sodass nun konsistentIO::TimeoutErrorausgelöst wird. (Bitte beachten Sie, dass beiSocket.tcpweiterhin Fälle auftreten können, in denenErrno::ETIMEDOUTin ähnlichen Situationen ausgelöst wird, und dass in beiden FällenErrno::ETIMEDOUTausgelöst werden kann, wenn das Timeout auf Betriebssystemebene auftritt.)
-
-
-
Unicode auf Version 17.0.0 und Emoji auf Version 17.0 aktualisiert. [Feature #19908][Feature #20724][Feature #21275] (gilt auch für
Regexp) -
String#strip,strip!,lstrip,lstrip!,rstripundrstrip!wurden erweitert, um*selectors-Argumente zu akzeptieren. [Feature #21552]
-
-
-
Einführung der Unterstützung für das
Thread#raise(cause:)-Argument, ähnlich wie beiKernel#raise. [Feature #21360]
-
Aktualisierungen der Standardbibliothek
Wir listen nur stdlib-Änderungen auf, die bemerkenswerte Funktionsänderungen sind.
Weitere Änderungen sind in den folgenden Abschnitten aufgeführt. Wir listen auch die Release-Historie seit der vorherigen gebündelten Version, Ruby 3.4.0, auf, falls sie GitHub Releases hat.
Die folgenden gebündelten Gems werden von Standard-Gems befördert.
-
ostruct 0.6.3
-
pstore 0.2.0
-
0.1.4 bis v0.2.0
-
benchmark 0.5.0
-
logger 1.7.0
-
rdoc 7.0.3
-
6.14.0 bis v6.14.1, v6.14.2, v6.15.0, v6.15.1, v6.16.0, v6.16.1, v6.17.0, v7.0.0, v7.0.1, v7.0.2, v7.0.3
-
win32ole 1.9.2
-
1.9.1 bis v1.9.2
-
irb 1.16.0
-
reline 0.6.3
-
readline 0.0.4
-
fiddle 1.1.8
Das folgende Standard-Gem wurde hinzugefügt.
-
win32-registry 0.1.2
Die folgenden Standard-Gems wurden aktualisiert.
-
RubyGems 4.0.3
-
bundler 4.0.3
-
date 3.5.1
-
delegate 0.6.1
-
digest 3.2.1
-
3.2.0 bis v3.2.1
-
english 0.8.1
-
0.8.0 bis v0.8.1
-
erb 6.0.1
-
error_highlight 0.7.1
-
etc 1.4.6
-
fcntl 1.3.0
-
1.2.0 bis v1.3.0
-
fileutils 1.8.0
-
1.7.3 bis v1.8.0
-
forwardable 1.4.0
-
1.3.3 bis v1.4.0
-
io-console 0.8.2
-
0.8.1 bis v0.8.2
-
io-nonblock 0.3.2
-
io-wait 0.4.0
-
0.3.2 bis v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
-
ipaddr 1.2.8
-
json 2.18.0
-
2.9.1 bis v2.10.0, v2.10.1, v2.10.2, v2.11.0, v2.11.1, v2.11.2, v2.11.3, v2.12.0, v2.12.1, v2.12.2, v2.13.0, v2.13.1, v2.13.2, v2.14.0, v2.14.1, v2.15.0, v2.15.1, v2.15.2, v2.16.0, v2.17.0, v2.17.1, v2.18.0
-
net-http 0.9.1
-
openssl 4.0.0
-
optparse 0.8.1
-
pp 0.6.3
-
0.6.2 bis v0.6.3
-
prism 1.7.0
-
psych 5.3.1
-
resolv 0.7.0
-
stringio 3.2.0
-
3.1.2 bis v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8, v3.1.9, v3.2.0
-
strscan 3.1.6
-
time 0.4.2
-
0.4.1 bis v0.4.2
-
timeout 0.6.0
-
uri 1.1.1
-
weakref 0.1.4
-
0.1.3 bis v0.1.4
-
zlib 3.2.2
-
3.2.1 bis v3.2.2
Die folgenden gebündelten Gems wurden aktualisiert.
-
minitest 6.0.0
-
power_assert 3.0.1
-
rake 13.3.1
-
test-unit 3.7.5
-
3.6.7 bis 3.6.8, 3.6.9, 3.7.0, 3.7.1, 3.7.2, 3.7.3, 3.7.4, 3.7.5
-
rexml 3.4.4
-
rss 0.3.2
-
0.3.1 bis 0.3.2
-
net-ftp 0.3.9
-
0.3.8 bis v0.3.9
-
net-imap 0.6.2
-
0.5.8 bis v0.5.9, v0.5.10, v0.5.11, v0.5.12, v0.5.13, v0.6.0, v0.6.1, v0.6.2
-
net-smtp 0.5.1
-
0.5.0 bis v0.5.1
-
matrix 0.4.3
-
0.4.2 bis v0.4.3
-
prime 0.1.4
-
0.1.3 bis v0.1.4
-
rbs 3.10.0
-
3.8.0 bis v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
-
typeprof 0.31.1
-
debug 1.11.1
-
1.11.0 bis v1.11.1
-
base64 0.3.0
-
0.2.0 bis v0.3.0
-
bigdecimal 4.0.1
-
3.1.8 bis v3.2.0, v3.2.1, v3.2.2, v3.2.3, v3.3.0, v3.3.1, v4.0.0, v4.0.1
-
drb 2.2.3
-
2.2.1 bis v2.2.3
-
syslog 0.3.0
-
0.2.0 bis v0.3.0
-
csv 3.3.5
-
repl_type_completor 0.1.12
RubyGems und Bundler
Ruby 4.0 gebündelte RubyGems und Bundler Version 4. Details finden Sie in 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 nun erforderlich ist.
-
Kompatibilitätsprobleme
-
Die folgenden Methoden wurden aus
Ractorentfernt, aufgrund der Hinzufügung vonRactor::Port-
Ractor.yield -
Ractor#take -
Ractor#close_incoming -
Ractor#close_outgoing
-
-
ObjectSpace._id2refist veraltet. [Feature #15408] -
Process::Status#&undProcess::Status#>>wurden entfernt. Sie waren in Ruby 3.3 veraltet. [Bug #19868] -
rb_path_checkwurde entfernt. Diese Funktion wurde für die$SAFE-Pfadprüfung verwendet, die in Ruby 2.7 entfernt wurde und bereits veraltet war. [Feature #20971] -
Ein Backtrace für
ArgumentError"wrong number of arguments" enthält nun den Klassennamen oder Modulnamen des Empfängers (z. B. inFoo#baranstelle von inbar). [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>'
Kompatibilitätsprobleme der Standardbibliothek
-
Die Bibliothek
CGIwurde aus den Standard-Gems entfernt. Nun bieten wir nur nochcgi/escapefür die folgenden Methoden an -
Mit der Überführung von
Setvon stdlib zu einer Kernklasse wurdeset/sorted_set.rbentfernt, undSortedSetist keine automatisch geladene Konstante mehr. Bitte installieren Sie dassorted_set-Gem undrequire 'sorted_set', umSortedSetzu verwenden. [Feature #21287] -
-
Das Standardverhalten, den Header
Content-Typeautomatisch aufapplication/x-www-form-urlencodedfür Anfragen mit Body (z. B.POST,PUT) zu setzen, wenn der Header nicht explizit gesetzt war, wurde entfernt. Wenn Ihre Anwendung auf diese automatische Standardeinstellung angewiesen war, werden Ihre Anfragen nun ohne Content-Type-Header gesendet, was potenziell die Kompatibilität mit bestimmten Servern beeinträchtigt. [GH-net-http #205]
-
Updates der C-API
-
-
rb_thread_fd_closeist veraltet und nun eine No-Op. Wenn Sie File-Deskriptoren von C-Erweiterungen für Ruby-Code verfügbar machen müssen, erstellen Sie eineIO-Instanz mitRUBY_IO_MODE_EXTERNALund verwenden Sierb_io_close(io), um sie zu schließen (dies unterbricht auch alle ausstehenden Operationen auf derIO-Instanz und wartet auf deren Abschluss). Direkte Schließung von File-Deskriptoren unterbricht keine ausstehenden Operationen und kann zu undefiniertem Verhalten führen. Mit anderen Worten: Wenn zweiIO-Objekte denselben File-Deskriptor teilen, hat das Schließen des einen keine Auswirkung auf den anderen. [Feature #18455]
-
-
GVL
-
rb_thread_call_with_gvlfunktioniert nun mit oder ohne GVL. Dies ermöglicht es Gems,ruby_thread_has_gvl_pzu vermeiden. Bitte achten Sie weiterhin sorgfältig auf die GVL. [Feature #20750]
-
-
Set
-
Eine C-API für
Setwurde 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 beim Übergeben von Schlüsselwortargumenten. Dies wurde auch in YJIT und ZJIT integriert. [Feature #21254] -
GC-Heaps unterschiedlicher Größenpools wachsen nun unabhängig voneinander, was den Speicherverbrauch reduziert, wenn nur einige Pools langlebige Objekte enthalten -
Das
GC-Sweeping ist auf Seiten mit großen Objekten schneller -
"Generic ivar"-Objekte (
String,Array,TypedDataetc.) verwenden nun ein neues internes "fields"-Objekt für schnelleren Zugriff auf Instanzvariablen -
Das
GCvermeidet die Pflege einer internenid2ref-Tabelle, bis diese zum ersten Mal verwendet wird, was die Zuweisung vonobject_idund dasGC-Sweeping beschleunigt -
object_idundhashsind bei Class- und Module-Objekten schneller -
Größere Bignum-Integer können eingebettet bleiben und Variable-Width-Speicher verwenden
-
Random,Enumerator::Product,Enumerator::Chain,Addrinfo,StringScannerund einige interne Objekte sind nun schreib-Barriere-geschützt, was denGC-Overhead reduziert.
Ractor
Viel Arbeit wurde investiert, um Raktoren stabiler, performanter und nutzbarer zu machen. Diese Verbesserungen bringen die Ractor-Implementierung näher an den experimentellen Status heran.
-
Leistungsverbesserungen
-
Gefrorene Strings und die Symboltabelle verwenden intern einen Lock-Free Hash Set [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 durch die Verwendung eines Per-Ractor-Zählers vermieden
-
CPU-Cache-Konflikte werden bei xmalloc/xfree durch die Verwendung eines Thread-lokalen Zählers vermieden
-
object_idvermeidet in den meisten Fällen Sperren
-
-
Fehlerbehebungen und Stabilität
-
Behebung möglicher Deadlocks bei der Kombination von Raktoren und Threads
-
Behebung von Problemen mit require und autoload in einem
Ractor -
Behebung von Kodierungs-/Transkodierungsproblemen über Raktoren hinweg
-
Behebung von Race Conditions bei
GC-Operationen und Methodeninvalidierung -
Behebung von Problemen mit Prozessen, die nach dem Start eines
Ractorgeforkt wurden -
GC-Zuweisungszähler sind nun unter Raktoren korrekt -
Behebung von TracePoints, die nach
GCnicht funktionierten [Bug #19112]
-
JIT
-
ZJIT
-
Einführung eines experimentellen, methodenbasierten JIT-Compilers. Wo verfügbar, kann ZJIT zur Laufzeit mit der Option
--zjitoder durch Aufruf vonRubyVM::ZJIT.enableaktiviert werden. Beim Bau von Ruby ist Rust 1.85.0 oder neuer erforderlich, um 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 davon ab, es vorerst in der Produktion einzusetzen.
-
Unser Ziel ist es, ZJIT in Ruby 4.1 schneller als YJIT und produktionsreif zu machen.
-
-
YJIT
-
-
ratio_in_yjitfunktioniert im Standard-Build nicht mehr. Verwenden Sie--enable-yjit=statsbeiconfigure, um es auf--yjit-statszu aktivieren. -
Fügt
invalidate_everythingzu den Standardstatistiken hinzu, die erhöht wird, wenn jeder Code vonTracePointungültig gemacht wird.
-
-
Fügt die Optionen
mem_size:undcall_threshold:zuRubyVM::YJIT.enablehinzu.
-
-
RJIT
-
--rjitwurde entfernt. Wir werden die Implementierung der Drittanbieter-JIT-API in das Repository ruby/rjit verschieben.
-