NEWS für Ruby 3.0.0
Dieses Dokument listet benutzerrelevante Änderungen seit der Veröffentlichung von 2.7.0 auf, ausgenommen sind Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Sprachänderungen
-
Schlüsselwortargumente sind nun von Positionsargumenten getrennt. Code, der in Ruby 2.7 Deprecation Warnings verursachte, führt nun zu einer
ArgumentErroroder einem anderen Verhalten. [Feature #14183] -
Procs, die ein einzelnes Rest-Argument und Schlüsselwörter akzeptieren, unterliegen nicht mehr dem Autosplatting. Dies entspricht nun dem Verhalten von Procs, die ein einzelnes Rest-Argument und keine Schlüsselwörter akzeptieren. [Feature #16166]
pr = proc{|*a, **kw| [a, kw]} pr.call([1]) # 2.7 => [[1], {}] # 3.0 => [[[1]], {}] pr.call([1, {a: 1}]) # 2.7 => [[1], {:a=>1}] # and deprecation warning # 3.0 => [[[1, {:a=>1}]], {}]
-
Argument-Weiterleitung (
...) unterstützt nun führende Argumente. [Feature #16378]def method_missing(meth, ...) send(:"do_#{meth}", ...) end
-
Pattern Matching (
case/in) ist nicht mehr experimentell. [Feature #17260] -
Einzeiliges Pattern Matching wurde überarbeitet. [EXPERIMENTELL]
-
=>wurde hinzugefügt. Es kann wie eine rechtsgerichtete Zuweisung verwendet werden. [Feature #17260]0 => a p a #=> 0 {b: 0, c: 1} => {b:} p b #=> 0
-
ingibt nuntrueoderfalsezurück. [Feature #17371]# version 3.0 0 in 1 #=> false # version 2.7 0 in 1 #=> raise NoMatchingPatternError
-
-
Find-Pattern wurde hinzugefügt. [EXPERIMENTELL] [Feature #16828]
case ["a", 1, "b", "c", 2, "d", "e", "f", 3] in [*pre, String => x, String => y, *post] p pre #=> ["a", 1] p x #=> "b" p y #=> "c" p post #=> [2, "d", "e", "f", 3] end
-
Endlose Methodendefinition wurde hinzugefügt. [EXPERIMENTELL] [Feature #16746]
def square(x) = x * x
-
Interpolierte
String-Literale werden nicht mehr eingefroren, wenn# frozen-string-literal: trueverwendet wird. [Feature #17104] -
Der Magische Kommentar
shareable_constant_valuewurde hinzugefügt, um Konstanten einzufrieren. Weitere Details finden Sie unter Magic Comments. [Feature #17273] -
Eine Grundlage für statische Analysen wurde eingeführt.
-
Deprecation Warnings werden standardmäßig nicht mehr angezeigt (seit Ruby 2.7.2). Schalten Sie sie mit
-W:deprecatedein (oder mit-w, um auch andere Warnungen anzuzeigen). [Feature #16345] -
$SAFEund$KCODEsind nun normale globale Variablen ohne besonderes Verhalten. C-API-Methoden im Zusammenhang mit$SAFEwurden entfernt. [Feature #16131] [Feature #17136] -
yieldin Singleton-Klassendefinitionen in Methoden führt nun zu einemSyntaxErroranstelle einer Warnung.yieldin einer Klassendefinition außerhalb einer Methode führt nun zu einemSyntaxErroranstelle einesLocalJumpError. [Feature #15575] -
Wenn eine Klassenvariable von einer gleichnamigen Definition in einer Elternklasse/einem Elternmodul überschrieben wird, wird nun ein
RuntimeErrorausgelöst (zuvor gab es im ausführlichen Modus nur eine Warnung). Zusätzlich führt der Zugriff auf eine Klassenvariable aus dem Top-Level-Bereich nun zu einemRuntimeError. [Bug #14541] -
Die Zuweisung zu einer nummerierten Parameter führt nun zu einem
SyntaxErroranstelle einer Warnung.
Kommandozeilenoptionen
--help Option
Wenn die Umgebungsvariable RUBY_PAGER oder PAGER vorhanden und nicht leer ist und die Standardeingabe und -ausgabe TTY sind, zeigt die Option --help die Hilfenachricht über den Pager an, der durch den Wert bezeichnet wird. [Feature #16754]
--backtrace-limit Option
Die Option --backtrace-limit beschränkt die maximale Länge eines Backtrace. [Feature #8661]
Aktualisierungen von Kernklassen
Nur ausstehende Elemente.
-
-
Die folgenden Methoden geben nun
Array-Instanzen anstelle von Unterklasseninstanzen zurück, wenn sie auf Unterklasseninstanzen aufgerufen werden: [Bug #6087] -
Kann mit
Enumerator::ArithmeticSequencegesliced werdendirty_data = ['--', 'data1', '--', 'data2', '--', 'data3'] dirty_data[(1..).step(2)] # take each second element # => ["data1", "data2", "data3"]
-
-
-
Binding#evalverwendet bei Aufruf mit einem Argument"(eval)"für__FILE__und1für__LINE__im ausgewerteten Code. [Bug #4352] [Bug #17419]
-
-
ConditionVariable
-
ConditionVariable#wait kann nun die Scheduler-Hooks
block/unblockin einem nicht-blockierenden Kontext aufrufen. [Feature #16786]
-
-
-
Dir.globundDir.[]sortieren nun standardmäßig die Ergebnisse und akzeptieren die Schlüsselwortoptionsort:. [Feature #8709]
-
-
-
ENV.exceptwurde hinzugefügt, was einen Hash zurückgibt, der die angegebenen Schlüssel und ihre Werte ausschließt. [Feature #15822] -
Windows: Lese
ENV-Namen und -Werte als UTF-8-kodierte Strings [Feature #12650]
-
-
-
Neue Kodierung IBM720 hinzugefügt. [Feature #16233]
-
Standardwert für
Encoding.default_externalunter Windows auf UTF-8 geändert [Feature #16604]
-
-
-
Fiber.new(blocking: true/false) erlaubt die Erstellung von nicht-blockierenden Ausführungskontexten. [Feature #16786] -
Fiber#blocking?gibt an, ob der Fiber nicht-blockierend ist. [Feature #16786] -
Fiber#backtraceundFiber#backtrace_locationsbieten pro-Fiber Backtraces. [Feature #16815] -
Die Einschränkung von
Fiber#transferwurde gelockert. [Bug #17221]
-
-
-
GC.auto_compact= und GC.auto_compact wurden hinzugefügt, um zu steuern, wann die Kompaktierung ausgeführt wird. Das Setzen von
auto_compact=auftruebewirkt, dass die Kompaktierung während großer Sammlungen stattfindet. Derzeit verursacht die Kompaktierung erhebliche Zusatzkosten für große Sammlungen, testen Sie also zuerst! [Feature #17176]
-
-
-
Hash#transform_keysundHash#transform_keys!akzeptieren nun einen Hash, der Schlüssel auf neue Schlüssel abbildet. [Feature #16274] -
Hash#exceptwurde hinzugefügt, was einen Hash zurückgibt, der die angegebenen Schlüssel und ihre Werte ausschließt. [Feature #15822]
-
-
-
IO#nonblock?ist nun standardmäßigtrue. [Feature #16786] -
IO#wait_readable,IO#wait_writable,IO#read,IO#writeund andere verwandte Methoden (z. B.IO#puts,IO#gets) können den Scheduler-Hook io_wait(io, events, timeout) in einem nicht-blockierenden Ausführungskontext aufrufen. [Feature #16786]
-
-
-
Kernel#cloneruft bei Aufruf mit dem Schlüsselwortfreeze: falseinitialize_clone mit dem Schlüsselwortfreeze: falseauf. [Bug #14266] -
Kernel#cloneruft bei Aufruf mit dem Schlüsselwortfreeze: trueinitialize_clone mit dem Schlüsselwortfreeze: trueauf und gibt eine eingefrorene Kopie zurück, auch wenn der Empfänger nicht eingefroren ist. [Feature #16175] -
Kernel#evalverwendet bei Aufruf mit zwei Argumenten"(eval)"für__FILE__und1für__LINE__im ausgewerteten Code. [Bug #4352] -
Kernel#lambdagibt nun eine Warnung aus, wenn es ohne einen Literal-Block aufgerufen wird. [Feature #15973] -
Kernel.sleepruft den Scheduler-Hook kernel_sleep(…) in einem nicht-blockierenden Ausführungskontext auf. [Feature #16786]
-
-
Module
-
Module#includeundModule#prependwirken sich nun auf Klassen und Module aus, die den Empfänger bereits inkludiert oder vorangestellt haben, was das Verhalten widerspiegelt, als ob die Argumente vor den anderen Modulen und Klassen, die den Empfänger inkludiert oder vorangestellt haben, in den Empfänger inkludiert worden wären. [Feature #9573]class C; end module M1; end module M2; end C.include M1 M1.include M2 p C.ancestors #=> [C, M1, M2, Object, Kernel, BasicObject]
-
Module#public,Module#protected,Module#private,Module#public_class_method,Module#private_class_method, Top-Level "private" und "public" Methoden akzeptieren nun ein einzelnes Array-Argument mit einer Liste von Methodennamen. [Feature #17314] -
Module#attr_accessor,Module#attr_reader,Module#attr_writerundModule#attrMethoden geben nun ein Array von definierten Methodennamen als Symbole zurück. [Feature #17314] -
Module#alias_methodgibt nun den definierten Alias als Symbol zurück. [Feature #17314]
-
-
Mutex
-
Mutexwird nun proFiberanstelle von proThreaderworben. Diese Änderung sollte für praktisch alle Verwendungen kompatibel sein und vermeidet Blockaden bei der Verwendung eines Schedulers. [Feature #16792]
-
-
-
Proc#==undProc#eql?sind nun definiert und geben für separateProc-Instanzen true zurück, wenn die Procs aus demselben Block erstellt wurden. [Feature #14267]
-
-
Queue / SizedQueue
-
Queue#pop, SizedQueue#push und verwandte Methoden können nun die Scheduler-Hooks
block/unblockin einem nicht-blockierenden Kontext aufrufen. [Feature #16786]
-
-
-
Neue Klasse zur Ermöglichung paralleler Ausführung hinzugefügt. Weitere Details finden Sie unter ractor.md.
-
-
-
Random::DEFAULTbezieht sich nun auf dieRandom-Klasse anstelle einerRandom-Instanz, damit es mitRactorfunktionieren kann. [Feature #17322] -
Random::DEFAULTist veraltet, da sein Wert nun verwirrend ist und es nicht mehr global ist. Verwenden Sie stattdessenKernel.rand/Random.randdirekt, oder erstellen Sie eineRandom-Instanz mitRandom.new. [Feature #17351]
-
-
-
Die folgenden Methoden geben nun
String-Instanzen anstelle von Unterklasseninstanzen zurück oder ergeben sie, wenn sie auf Unterklasseninstanzen aufgerufen werden: [Bug #10845]
-
-
-
Symbol#to_procgibt nun einen Lambda-Proczurück. [Feature #16260] -
Symbol#namewurde hinzugefügt, was den Namen des Symbols zurückgibt, wenn es benannt ist. Der zurückgegebene String ist eingefroren. [Feature #16150]
-
-
-
Einführung von
Fiber.set_schedulerzum Abfangen blockierender Operationen undFiber.schedulerzum Zugriff auf den aktuellen Scheduler. Weitere Details dazu, welche Operationen unterstützt werden und wie die Scheduler-Hooks implementiert werden, finden Sie unter fiber.md. [Feature #16786] -
Fiber.blocking?gibt an, ob der aktuelle Ausführungskontext blockiert. [Feature #16786]
-
-
-
Thread#joinruft die Scheduler-Hooksblock/unblockin einem nicht-blockierenden Ausführungskontext auf. [Feature #16786] -
Der Akzessor
Thread.ignore_deadlockwurde hinzugefügt, um die standardmäßige Deadlock-Erkennung zu deaktivieren und die Verwendung von Signalhandlern zur Auflösung von Deadlocks zu ermöglichen. [Bug #13767]
-
-
-
Warning#warnunterstützt nun ein Schlüsselwortargument für die Kategorie. [Feature #17122]
-
Aktualisierungen der Standardbibliothek
Nur ausstehende Elemente.
-
-
Aktualisierung auf
BigDecimal3.0.0 -
Diese Version ist
Ractor-kompatibel.
-
-
-
Aktualisierung auf
Bundler2.2.3
-
-
-
Aktualisierung auf 0.2.0
-
Diese Version ist
Ractor-kompatibel.
-
-
CSV
-
Aktualisierung auf CSV 3.1.9
-
-
Fiddle
-
Aktualisierung auf Fiddle 1.0.5
-
-
IRB
-
Aktualisierung auf IRB 1.2.6
-
-
Set
-
-
Hinzufügen von :connect_timeout zu
TCPSocket.new[Feature #17187]
-
-
-
Net::HTTP#verify_hostname=undNet::HTTP#verify_hostnamewurden hinzugefügt, um die Hostnamenverifizierung zu überspringen. [Feature #16555] -
Net::HTTP.get,Net::HTTP.get_responseundNet::HTTP.get_printkönnen die Anfrageheader alsHashim zweiten Argument entgegennehmen, wenn das erste Argument eineURIist. [Feature #16686]
-
-
Net::SMTP
-
SNI-Unterstützung hinzugefügt.
-
Net::SMTP.start-Argumente sind Schlüsselwortargumente.
-
TLS sollte standardmäßig nicht den Hostnamen überprüfen.
-
-
-
Initialisierung ist nicht mehr verzögert. [Bug #12136]
-
Eingebaute Methoden können nun sicher überschrieben werden. [Bug #15409]
-
Implementierung verwendet nur Methoden, die mit
!enden. -
Ractor-kompatibel. -
Verwenden Sie die offiziell abgeratenen Methoden. Lesen Sie die Hinweise im Abschnitt
OpenStruct.
-
-
-
Ractor-kompatibel.
-
-
Reline
-
Aktualisierung auf Reline 0.1.5
-
-
RubyGems
-
Aktualisierung auf RubyGems 3.2.3
-
-
-
Aktualisierung auf
StringScanner3.0.0 -
Diese Version ist
Ractor-kompatibel.
-
-
-
URI.escapeundURI.unescapewurden entfernt. Verwenden Sie stattdessen die folgenden Methoden, je nach Ihrem spezifischen Anwendungsfall.
-
Kompatibilitätsprobleme
Ausgenommen sind behobene Fehler.
-
Regexp-Literale und alleRange-Objekte sind eingefroren. [Feature #8948] [Feature #16377] [Feature #15504]/foo/.frozen? #=> true (42...).frozen? # => true
-
EXPERIMENTELL:
Hash#eachgibt konsistent ein 2-Element-Array zurück. [Bug #12706]-
Nun löst
{ a: 1 }.each(&->(k, v) { })aufgrund der Arity-Prüfung von Lambda einenArgumentErroraus.
-
-
Beim Schreiben in STDOUT, das auf eine geschlossene Pipe umgeleitet wird, wird nun keine "broken pipe"-Fehlermeldung mehr angezeigt. [Feature #14413]
-
TRUE/FALSE/NIL-Konstanten sind nicht mehr definiert. -
Integer#zero?überschreibtNumeric#zero?zur Optimierung. [Misc #16961] -
Enumerable#grepundEnumerable#grep_vmodifizieren bei Übergabe einesRegexpund ohne Block nicht mehrRegexp.last_match. [Bug #17030] -
Das Requieren von 'open-uri' definiert
Kernel#opennicht mehr neu. Rufen Sie stattdessen direktURI.openauf oder verwenden Sieuse URI#open. [Misc #15893] -
SortedSet wurde aus Abhängigkeits- und Leistungsgründen entfernt.
Kompatibilitätsprobleme der Standardbibliothek
-
Standard-Gems
-
Die folgenden Bibliotheken wurden von stdlib zu Standard-Gems befördert.
-
abbrev
-
base64
-
drb
-
debug
-
erb
-
find
-
net-ftp
-
net-http
-
net-imap
-
net-protocol
-
open-uri
-
optparse
-
pp
-
prettyprint
-
resolv-replace
-
resolv
-
rinda
-
set
-
securerandom
-
shellwords
-
tempfile
-
tmpdir
-
time
-
tsort
-
un
-
weakref
-
Die folgenden Erweiterungen wurden von stdlib zu Standard-Gems befördert.
-
digest
-
io-nonblock
-
io-wait
-
nkf
-
Pfadname
-
syslog
-
win32ole
-
-
-
Gebündelte Gems
-
net-telnet und xmlrpc wurden aus den gebündelten Gems entfernt. Wenn Sie an deren Pflege interessiert sind, kommentieren Sie bitte Ihren Plan unter github.com/ruby/xmlrpc oder github.com/ruby/net-telnet.
-
-
SDBM wurde aus der Ruby-Standardbibliothek entfernt. [Bug #8446]
-
Die Probleme von sdbm werden unter github.com/ruby/sdbm behandelt.
-
-
WEBrick wurde aus der Ruby-Standardbibliothek entfernt. [Feature #17303]
-
Die Probleme von WEBrick werden unter github.com/ruby/webrick behandelt.
-
Updates der C-API
-
C API-Funktionen im Zusammenhang mit
$SAFEwurden entfernt. [Feature #16131] -
Die C API-Headerdatei
ruby/ruby.hwurde aufgeteilt. [GH-2991]Dies sollte keine Auswirkungen auf Erweiterungsbibliotheken haben, aber Benutzer könnten langsame Kompilierungszeiten erleben.
-
Memory View Interface [EXPERIMENTELL]
-
Das Memory View Interface ist eine C-API-Sammlung zum Austausch eines rohen Speicherbereichs, wie z. B. eines numerischen Arrays oder eines Bitmap-Bildes, zwischen Erweiterungsbibliotheken. Die Erweiterungsbibliotheken können auch die Metadaten des Speicherbereichs austauschen, die aus Form, Elementformat usw. bestehen. Unter Verwendung dieser Metadaten können die Erweiterungsbibliotheken sogar mehrdimensionale Arrays korrekt austauschen. Diese Funktion ist der Pufferprotokoll von Python nachempfunden. [Feature #13767] [Feature #14722]
-
-
Ractor-bezogene C-APIs werden eingeführt (experimentell) in "include/ruby/ractor.h".
Implementierungsverbesserungen
-
Neuer Methodencache-Mechanismus für
Ractor. [Feature #16614]-
Von ISeq verwiesene Inline-Methodencaches können von mehreren Ractoren parallel abgerufen werden, und eine Synchronisation ist auch für Methodencaches erforderlich. Eine solche Synchronisation kann jedoch zu Overhead führen. Daher werden neue Inline-Methodencache-Mechanismen eingeführt: (1) Disposable Inline Method Cache (2) Per-Class Method Cache und (3) neuer Invalidierungsmechanismus. (1) kann die Synchronisation pro Methodenaufruf vermeiden, da nur atomare Operationen verwendet werden. Einzelheiten finden Sie im Ticket.
-
-
Die Anzahl der Hashs, die bei Verwendung eines Schlüsselwort-Splats in einem Methodenaufruf zugewiesen werden, wurde auf maximal 1 reduziert, und das Übergeben eines Schlüsselwort-Splats an eine Methode, die bestimmte Schlüsselwörter akzeptiert, weist keinen Hash zu.
-
superwird optimiert, wenn bei vorherigem Aufruf die gleiche Art von Methode aufgerufen wird, sofern es sich nicht um Verfeinerungen oder einen Attribut-Leser oder -Schreiber handelt.
JIT
-
Leistungsverbesserungen von JIT-kompiliertem Code
-
Mikroarchitektonische Optimierungen
-
Von mehreren Methoden gemeinsam genutzte native Funktionen werden bei der JIT-Kompaktierung dedupliziert.
-
Reduzierung der Code-Größe von "hot paths" durch einige Optimierungen und Partitionierung von "cold paths".
-
-
Instanzvariablen
-
Einige redundante Prüfungen wurden eliminiert.
-
Überspringen der wiederholten Prüfung einer Klasse und eines Objekts in einer Methode, wenn möglich.
-
Optimierung von Zugriffen in einigen Kernklassen wie
Hashund deren Unterklassen.
-
-
Methodeninlining-Unterstützung für einige C-Methoden
-
Konstantenreferenzen werden inline gestellt.
-
Generierung von geeignetem Code für Aufrufe von
==,nil?und!, abhängig von der Empfängerklasse. -
Reduzierung der Anzahl von PC-Zugriffen bei Verzweigungen und Methodenrückgaben.
-
Optimierung von C-Methodenaufrufen.
-
-
Verbesserungen des Kompilierungsprozesses
-
Temporäre Dateien werden nicht mehr in /tmp gespeichert.
-
Drosselung von
GCund Kompaktierung von JIT-kompiliertem Code. -
Vermeidung der GC-Bereinigung von JIT-kompiliertem Code, wenn nicht notwendig.
-
GC-Bereinigung von JIT-kompiliertem Code erfolgt in einem Hintergrund-Thread.
-
Reduzierung der Anzahl von Sperren zwischen Ruby- und JIT-Threads.
-
Statische Analyse
RBS
-
RBS ist eine neue Sprache für die Typdefinition von Ruby-Programmen. Sie ermöglicht das Schreiben von Typen für Klassen und Module mit fortgeschrittenen Typen, einschließlich Union Types, Überladungen, Generika und *Interface Types* für Duck Typing.
-
Ruby wird mit Typdefinitionen für Kern-/Standardbibliotheksklassen geliefert.
-
Das
rbs-Gem ist gebündelt, um RBS-Dateien zu laden und zu verarbeiten.
TypeProf
-
TypeProf ist ein Werkzeug zur Typanalyse von Ruby-Code basierend auf abstrakter Interpretation.
-
Es liest nicht annotierten Ruby-Code, versucht, seine Typsignatur abzuleiten, und gibt das Analyseergebnis im RBS-Format aus.
-
Obwohl es bisher nur eine Teilmenge der Ruby-Sprache unterstützt, werden wir die Abdeckung von Sprachfunktionen, Analyseleistung und Benutzerfreundlichkeit kontinuierlich verbessern.
-
# test.rb def foo(x) if x > 10 x.to_s else nil end end foo(42)
$ typeprof test.rb # Classes class Object def foo : (Integer) -> String? end
Sonstige Änderungen
-
Methoden, die
ruby2_keywordsverwenden, behalten keine leeren Schlüsselwort-Splats mehr; diese werden nun genauso entfernt wie bei Methoden, dieruby2_keywordsnicht verwenden. -
Wenn eine Ausnahme im Standardhandler abgefangen wird, werden die Fehlermeldung und der Backtrace in aufsteigender Reihenfolge vom innersten Element ausgegeben. [Feature #8661]
-
Der Zugriff auf eine nicht initialisierte Instanzvariable gibt nun keine Warnung mehr im ausführlichen Modus aus. [Feature #17055]