NEWS für Ruby 3.1.0
Dieses Dokument listet änderungen an benutzerorientierten Funktionen seit der Veröffentlichung 3.0.0 auf, mit Ausnahme von Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag auf ein Minimum beschränkt ist, siehe Links für Details.
Sprachänderungen
-
Das Blockargument kann nun anonym sein, wenn der Block nur an eine andere Methode übergeben wird. [Feature #11256]
def foo(&) bar(&) end
-
Der Pin-Operator nimmt nun einen Ausdruck an. [Feature #17411]
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a #=> [[3, 5], [5, 7], [11, 13]]
-
Der Pin-Operator unterstützt nun Instanz-, Klassen- und globale Variablen. [Feature #17724]
@n = 5 Prime.each_cons(2).lazy.find{_1 in [n, ^@n]} #=> [3, 5]
-
Pattern Matching für einzeilige Ausdrücke ist nicht mehr experimentell.
-
Klammern können beim einzeiligen Pattern Matching weggelassen werden. [Feature #16182]
[0, 1] => _, x {y: 2} => y: x #=> 1 y #=> 2
-
Die Auswertungsreihenfolge von Mehrfachzuweisungen wurde mit der Auswertungsreihenfolge von Einzelzuweisungen konsistent gemacht. Bei Einzelzuweisungen verwendet Ruby eine Auswertungsreihenfolge von links nach rechts. Mit diesem Code
foo[0] = bar
Wird die folgende Auswertungsreihenfolge verwendet
-
foo -
bar -
[]=wird auf dem Ergebnis vonfooaufgerufen
In Ruby vor 3.1.0 folgte die Mehrfachzuweisung nicht dieser Auswertungsreihenfolge. Mit diesem Code
foo[0], bar.baz = a, b
Würden Versionen von Ruby vor 3.1.0 in der folgenden Reihenfolge ausgewertet
-
a -
b -
foo -
[]=wird auf dem Ergebnis vonfooaufgerufen -
bar -
baz=wird auf dem Ergebnis vonbaraufgerufen
Ab Ruby 3.1.0 ist die Auswertungsreihenfolge nun konsistent mit Einzelzuweisungen, wobei die linke Seite vor der rechten Seite ausgewertet wird
-
foo -
bar -
a -
b -
[]=wird auf dem Ergebnis vonfooaufgerufen -
baz=wird auf dem Ergebnis vonbaraufgerufen
-
-
Werte in
Hash-Literalen und Schlüsselwortargumenten können weggelassen werden. [Feature #14579]Zum Beispiel,
-
{x:, y:}ist eine Syntax-Zucker von{x: x, y: y}. -
foo(x:, y:)ist eine Syntax-Zucker vonfoo(x: x, y: y).
Konstantennamen, lokale Variablennamen und Methodennamen sind als Schlüsselnamen erlaubt. Beachten Sie, dass ein reserviertes Wort als lokale Variable oder Methodenname betrachtet wird, auch wenn es ein Pseudovariablenname wie
selfist. -
-
Nicht-Haupt-Raktoren können Instanzvariablen (ivars) von Klassen/Modulen abrufen, wenn ivars auf teilbare Objekte verweisen. [Feature #17592]
-
Eine Befehlssyntax ist in endlosen Methodendefinitionen erlaubt, d.h. Sie können jetzt
def foo = puts "Hello"schreiben. Beachten Sie, dassprivate def foo = puts "Hello"nicht geparst wird. [Feature #17398]
Kommandozeilenoptionen
-
--disable-gemsist nun explizit als "nur zum Debuggen" deklariert. Verwenden Sie es niemals in produktionsrelevantem Code. [Feature #17684]
Aktualisierungen von Kernklassen
Hinweis: Wir listen nur wichtige Klassenaktualisierungen auf.
-
-
Array#intersect?wurde hinzugefügt. [Feature #15198]
-
-
Class
-
Class#subclasses, das ein Array von Klassen zurückgibt, die direkt vom Empfänger erben, mit Ausnahme von Singleton-Klassen. [Feature #18273]class A; end class B < A; end class C < B; end class D < A; end A.subclasses #=> [D, B] B.subclasses #=> [C] C.subclasses #=> []
-
-
-
Enumerable#compactwurde hinzugefügt. [Feature #17312] -
Enumerable#tallyakzeptiert nun einen optionalen Hash zum Zählen. [Feature #17744] -
Enumerable#each_consundeach_slicegeben nun einen Empfänger zurück. [GH-1509][1, 2, 3].each_cons(2){} # 3.0 => nil # 3.1 => [1, 2, 3] [1, 2, 3].each_slice(2){} # 3.0 => nil # 3.1 => [1, 2, 3]
-
-
-
Enumerator::Lazy#compactwurde hinzugefügt. [Feature #17312]
-
-
-
File.dirnameakzeptiert nun ein optionales Argument für die Ebene, um Pfadkomponenten zu entfernen. [Feature #12194]
-
-
-
"GC.measure_total_time = true" aktiviert die Messung von
GC. Die Messung kann zu Overhead führen. Sie ist standardmäßig aktiviert.GC.measure_total_timegibt die aktuelle Einstellung zurück.GC.stat[:time]oderGC.stat(:time) gibt die gemessene Zeit in Millisekunden zurück. [[Feature #10917]] -
GC.total_timegibt die gemessene Zeit in Nanosekunden zurück. [[Feature #10917]]
-
-
-
Integer.try_convertwurde hinzugefügt. [Feature #15211]
-
-
-
Kernel#loadakzeptiert nun ein Modul als zweites Argument und lädt die Datei unter Verwendung des gegebenen Moduls als oberstes Modul. [Feature #6210]
-
-
-
Marshal.loadakzeptiert nun die Optionfreeze: true. Alle zurückgegebenen Objekte sind gefroren, außerClass- undModule-Instanzen. Zeichenketten werden dedupliziert. [Feature #18148]
-
-
-
MatchData#matchwurde hinzugefügt [Feature #18172] -
MatchData#match_lengthwurde hinzugefügt [Feature #18172]
-
-
Methode /
UnboundMethod-
Method#public?, Method#private?, Method#protected?, UnboundMethod#public?, UnboundMethod#private?, UnboundMethod#protected? wurden hinzugefügt. [Feature #11689]
-
-
Module
-
Module#prependmodifiziert nun die Vorfahrenkette, wenn der Empfänger bereits das Argument enthält.Module#prependmodifiziert die Vorfahrenkette immer noch nicht, wenn der Empfänger das Argument bereits vorangestellt hat. [Bug #17423] -
Module#private, public, protected und module_function geben nun ihre Argumente zurück. Wenn ein einzelnes Argument gegeben wird, wird es zurückgegeben. Wenn keine Argumente gegeben werden, wird nil zurückgegeben. Wenn mehrere Argumente gegeben werden, werden sie als Array zurückgegeben. [Feature #12495]
-
-
Process
-
Process._forkwurde hinzugefügt. Dies ist eine Kernmethode für fork(2). Rufen Sie diese Methode nicht direkt auf; sie wird von bestehenden fork-Methoden aufgerufen:Kernel.#fork,Process.forkundIO.popen(“-”). Anwendungsüberwachungsbibliotheken können diese Methode überschreiben, um fork-Ereignisse abzufangen. [Feature #17795]
-
-
-
Das Übergeben von nur Schlüsselwortargumenten an Struct#initialize führt zu einer Warnung. Sie müssen ein
Hash-Literal verwenden, um einenHashan das erste Element zu übergeben. [Feature #16806] -
StructClass#keyword_init? wurde hinzugefügt [Feature #18008]
-
-
-
Unicode-Version auf 13.0.0 [Feature #17750] und Emoji-Version auf 13.0 [Feature #18029] aktualisiert
-
String#unpackundString#unpack1akzeptieren nun ein Schlüsselwortargumentoffset:, um das Entpacken nach dem Überspringen einer beliebigen Anzahl von Bytes zu starten. Wennoffsetaußerhalb der String-Grenzen liegt, wird einArgumentErrorausgelöst. [Feature #18254]
-
-
-
Thread#native_thread_idwurde hinzugefügt. [Feature #17853]
-
-
-
Thread::Backtrace.limit, das den durch die Kommandozeilenoption--backtrace-limitgesetzten Wert für die Begrenzung der Rückverfolgungslänge zurückgibt, wurde hinzugefügt. [Feature #17479]
-
-
-
Thread::Queue.newakzeptiert nun einEnumerablevon Anfangswerten. [Feature #17327]
-
-
-
Time.newakzeptiert nun ein optionales Schlüsselwortargumentin:für die Zeitzone, ebenso wieTime.atundTime.now, so dass Sie nun kleinere Argumente anTime.newweglassen können. [Feature #17485]Time.new(2021, 12, 25, in: "+07:00") #=> 2021-12-25 00:00:00 +0700
Gleichzeitig werden Zeitkomponenten-Zeichenketten nun strenger in Ganzzahlen umgewandelt.
Time.new(2021, 12, 25, "+07:30") #=> invalid value for Integer(): "+07:30" (ArgumentError)
Ruby 3.0 oder früher gab wahrscheinlich ein unerwartetes Ergebnis
2021-12-25 07:00:00zurück, nicht2021-12-25 07:30:00noch2021-12-25 00:00:00 +07:30. -
Time#strftimeunterstützt RFC 3339 UTC für unbekannte Offset-Lokalzeit,-0000, als%-z. [Feature #17544]
-
-
-
TracePoint.allow_reentrywurde hinzugefügt, um das erneute Betreten während desTracePoint-Callbacks zu ermöglichen. [Feature #15912]
-
-
$LOAD_PATH
-
$LOAD_PATH.resolve_feature_path löst keinen Fehler aus. [Feature #16043]
-
-
Fiber Scheduler
-
Unterstützung für
Addrinfo.getaddrinfomit dem Hookaddress_resolvehinzugefügt. [Feature #17370] -
Nicht-blockierendes
Timeout.timeoutüber den Hooktimeout_aftereingeführt. [Feature #17470] -
Neue Scheduler-Hooks
io_readundio_writezusammen mit einem Low-LevelIO::Bufferfür Zero-Copy-Lese-/Schreibvorgänge eingeführt. [Feature #18020] -
IO-Hooksio_wait,io_read,io_writeempfangen das ursprünglicheIO-Objekt, wenn möglich. [Bug #18003] -
Monitorwurde Fiber-sicher gemacht. [Bug #17827] -
Kopier-Coroutine durch pthread-Implementierung ersetzt. [Feature #18015]
-
-
-
Neue Klasse, die ein durch
Module#refineerzeugtes Modul darstellt.includeundprependsind veraltet, und stattdessen wurdeimport_methodshinzugefügt. [Bug #17429]
-
Aktualisierungen der Standardbibliothek
-
Die folgenden Standardgems wurden aktualisiert.
-
RubyGems 3.3.3
-
base64 0.1.1
-
benchmark 0.2.0
-
bigdecimal 3.1.1
-
bundler 2.3.3
-
cgi 0.3.1
-
csv 3.2.2
-
date 3.2.2
-
did_you_mean 1.6.1
-
digest 3.1.0
-
drb 2.1.0
-
erb 2.2.3
-
error_highlight 0.3.0
-
etc 1.3.0
-
fcntl 1.0.1
-
fiddle 1.1.0
-
fileutils 1.6.0
-
find 0.1.1
-
io-console 0.5.10
-
io-wait 0.2.1
-
ipaddr 1.2.3
-
irb 1.4.1
-
json 2.6.1
-
logger 1.5.0
-
net-http 0.2.0
-
net-protocol 0.1.2
-
nkf 0.1.1
-
open-uri 0.2.0
-
openssl 3.0.0
-
optparse 0.2.0
-
ostruct 0.5.2
-
pathname 0.2.0
-
pp 0.3.0
-
prettyprint 0.1.1
-
psych 4.0.3
-
racc 1.6.0
-
rdoc 6.4.0
-
readline 0.0.3
-
readline-ext 0.1.4
-
reline 0.3.0
-
resolv 0.2.1
-
rinda 0.1.1
-
ruby2_keywords 0.0.5
-
securerandom 0.1.1
-
set 1.0.2
-
stringio 3.0.1
-
strscan 3.0.1
-
tempfile 0.1.2
-
time 0.2.0
-
timeout 0.2.0
-
tmpdir 0.1.2
-
un 0.2.0
-
uri 0.11.0
-
yaml 0.2.0
-
zlib 2.1.1
-
RubyGems 3.3.3
-
base64 0.1.1
-
benchmark 0.2.0
-
bigdecimal 3.1.1
-
bundler 2.3.3
-
cgi 0.3.1
-
csv 3.2.2
-
date 3.2.2
-
did_you_mean 1.6.1
-
digest 3.1.0
-
drb 2.1.0
-
erb 2.2.3
-
error_highlight 0.3.0
-
etc 1.3.0
-
fcntl 1.0.1
-
fiddle 1.1.0
-
fileutils 1.6.0
-
find 0.1.1
-
io-console 0.5.10
-
io-wait 0.2.1
-
ipaddr 1.2.3
-
irb 1.4.1
-
json 2.6.1
-
logger 1.5.0
-
net-http 0.2.0
-
net-protocol 0.1.2
-
nkf 0.1.1
-
open-uri 0.2.0
-
openssl 3.0.0
-
optparse 0.2.0
-
ostruct 0.5.2
-
pathname 0.2.0
-
pp 0.3.0
-
prettyprint 0.1.1
-
psych 4.0.3
-
racc 1.6.0
-
rdoc 6.4.0
-
readline 0.0.3
-
readline-ext 0.1.4
-
reline 0.3.0
-
resolv 0.2.1
-
rinda 0.1.1
-
ruby2_keywords 0.0.5
-
securerandom 0.1.1
-
set 1.0.2
-
stringio 3.0.1
-
strscan 3.0.1
-
tempfile 0.1.2
-
time 0.2.0
-
timeout 0.2.0
-
tmpdir 0.1.2
-
un 0.2.0
-
uri 0.11.0
-
yaml 0.2.0
-
zlib 2.1.1
-
-
Die folgenden gebündelten Gems wurden aktualisiert.
-
minitest 5.15.0
-
power_assert 2.0.1
-
rake 13.0.6
-
test-unit 3.5.3
-
rexml 3.2.5
-
rbs 2.0.0
-
typeprof 0.21.1
-
minitest 5.15.0
-
power_assert 2.0.1
-
rake 13.0.6
-
test-unit 3.5.3
-
rexml 3.2.5
-
rbs 2.0.0
-
typeprof 0.21.1
-
-
Die folgenden Standardgems sind nun gebündelte Gems.
-
net-ftp 0.1.3
-
net-imap 0.2.2
-
net-pop 0.1.1
-
net-smtp 0.3.1
-
matrix 0.4.2
-
prime 0.1.2
-
debug 1.4.0
-
net-ftp 0.1.3
-
net-imap 0.2.2
-
net-pop 0.1.1
-
net-smtp 0.3.1
-
matrix 0.4.2
-
prime 0.1.2
-
debug 1.4.0
-
-
Die folgenden Gems wurden aus der Ruby-Standardbibliothek entfernt.
-
dbm
-
gdbm
-
tracer
-
dbm
-
gdbm
-
tracer
-
-
Coverage-Messung unterstützt nun Unterbrechung. Sie könnenCoverage.suspendverwenden, um die Messung vorübergehend zu stoppen, undCoverage.resume, um sie neu zu starten. Lesen Sie [Feature #18176] im Detail. -
Random::Formatterwurde nach random/formatter.rb verschoben, sodass SieRandom#hex,Random#base64usw. ohneSecureRandomverwenden können. [Feature #18190]
Kompatibilitätsprobleme
Hinweis: Ausgeschlossen sind Fehlerbehebungen von Funktionen.
-
rb_io_wait_readable,rb_io_wait_writableundrb_wait_for_single_fdsind zugunsten vonrb_io_maybe_wait_readable,rb_io_maybe_wait_writablebzw.rb_io_maybe_waitveraltet.rb_thread_wait_fdundrb_thread_fd_writablesind veraltet. [Bug #18003]
Kompatibilitätsprobleme der Standardbibliothek
-
ERB#initializewarntsafe_levelund spätere Argumente, auch ohne -w. [Feature #14256] -
lib/debug.rbwurde durchdebug.gemersetzt -
Kernel#ppin lib/pp.rb verwendet standardmäßig die Breite vonIO#winsize. Das bedeutet, dass die Ausgabebreite je nach Terminalgröße automatisch geändert wird. [Feature #12913] -
Psych4.0 ändertPsych.loadstandardmäßig alssafe_load. Möglicherweise müssen SiePsych3.3.2 für die Migration zu diesem Verhalten verwenden. [Bug #17866]
Updates der C-API
-
Dokumentiert. [GH-4815]
-
rb_gc_force_recycleist veraltet und wurde zu einem No-Op geändert. [Feature #18290]
Implementierungsverbesserungen
-
Der Inline-Cache-Mechanismus wurde für das Lesen von Klassenvariablen eingeführt. [Feature #17763]
-
instance_evalundinstance_execweisen nun nur dann eine Singleton-Klasse zu, wenn dies erforderlich ist, wodurch zusätzliche Objekte vermieden und die Leistung verbessert wird. [GH-5146] -
Die Leistung von
Struct-Accessoren wurde verbessert. [GH-5131] -
mandatory_only?eingebaute spezielle Form, um die Leistung bei eingebauten Methoden zu verbessern. [GH-5112] -
Experimentelle Funktion Variable Width Allocation im Garbage Collector. Diese Funktion ist standardmäßig deaktiviert und kann durch Kompilieren von Ruby mit gesetztem Flag
USE_RVARGC=1aktiviert werden. [Feature #18045] [Feature #18239]
JIT
-
--jitvon Ruby 3.0 wurde in--mjitumbenannt und--jitwurde auf Nicht-Windows x86-64-Plattformen zu--yjitund auf anderen zu--mjitaliasifiziert.
MJIT
-
Der Standardwert von
--mjit-max-cachewurde von 100 auf 10000 geändert. -
JIT-kompilierter Code wird nicht mehr abgebrochen, wenn ein
TracePointfür Klassenevents aktiviert ist. -
Der JIT-Compiler überspringt die Kompilierung von Methoden mit mehr als 1000 Anweisungen nicht mehr.
-
--mjit-verboseund--mjit-warninggeben "JIT cancel" aus, wenn JIT-kompilierter Code deaktiviert wird, weilTracePointoder GC.compact verwendet wird.
YJIT: Neuer experimenteller In-Process JIT-Compiler
Neuer JIT-Compiler als experimentelle Funktion verfügbar. [Feature #18229]
Siehe diesen Blogbeitrag, der das Projekt vorstellt.
-
Standardmäßig deaktiviert, verwenden Sie die Kommandozeilenoption
--yjit, um YJIT zu aktivieren. -
Leistungsverbesserungen bei Benchmarks, die auf realer Software basieren, bis zu 22% bei railsbench, 39% bei liquid-render.
-
Schnelle Aufwärmzeiten.
-
Derzeit nur für Unix-ähnliche x86-64-Plattformen.
Statische Analyse
RBS
-
Generische Typparameter können eingeschränkt werden (PR).
# `T` must be compatible with the `_Output` interface. # `PrettyPrint[String]` is ok, but `PrettyPrint[Integer]` is a type error. class PrettyPrint[T < _Output] interface _Output def <<: (String) -> void end attr_reader output: T def initialize: (T output) -> void end -
Typaliasierungen können generisch sein. (PR)
# Defines a generic type `list`. type list[T] = [ T, list[T] ] | nil type str_list = list[String] type int_list = list[Integer] -
rbs collection wurde eingeführt, um RBS von Gems zu verwalten.
-
Viele Signaturen für integrierte und Standardbibliotheken wurden hinzugefügt/aktualisiert.
-
Es enthält auch viele Fehlerbehebungen und Leistungsverbesserungen.
Weitere Informationen finden Sie im CHANGELOG.md.
TypeProf
-
Experimentelle IDE-Unterstützung wurde implementiert.
-
Viele Fehlerbehebungen und Leistungsverbesserungen seit Ruby 3.0.0.
Debugger
-
Ein neuer Debugger debug.gem ist gebündelt. debug.gem ist eine schnelle Debugger-Implementierung und bietet viele Funktionen wie Remote-Debugging, farbige REPL, IDE (VSCode)-Integration und mehr. Er ersetzt die Standardbibliothek
lib/debug.rb. -
Der Befehl
rdbgwird auch in das Verzeichnisbin/installiert, um die Debugging-Ausführung zu starten und zu steuern.
error_highlight
Ein integriertes Gem namens error_highlight wurde eingeführt. Es zeigt detaillierte Fehlerpositionen in der Rückverfolgung.
Beispiel: title = json[:article][:title]
Wenn json nil ist, zeigt es
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
title = json[:article][:title]
^^^^^^^^^^
Wenn json[:article] nil zurückgibt, zeigt es
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
title = json[:article][:title]
^^^^^^^^
Diese Funktion ist standardmäßig aktiviert. Sie können sie mit der Kommandozeilenoption --disable-error_highlight deaktivieren. Details finden Sie im Repository.
IRB Autovervollständigung und Dokumentationsanzeige
IRB verfügt nun über eine Autovervollständigungsfunktion, bei der Sie einfach Code eingeben können und ein Dialogfeld mit Vervollständigungskandidaten erscheint. Sie können Tab und Shift+Tab verwenden, um nach oben und unten zu navigieren.
Wenn Dokumente installiert sind, wenn Sie einen Vervollständigungskandidaten auswählen, erscheint ein Dokumentationsdialog neben dem Dialogfeld mit den Vervollständigungskandidaten, das einen Teil des Inhalts anzeigt. Sie können das vollständige Dokument lesen, indem Sie Alt+d drücken.
Sonstige Änderungen
-
lib/objspace/trace.rb wurde hinzugefügt, ein Werkzeug zur Nachverfolgung der Objektallokation. Allein durch das Einbinden dieser Datei wird die Nachverfolgung *sofort* gestartet. Allein durch
Kernel#pkönnen Sie untersuchen, wo ein Objekt erstellt wurde. Beachten Sie, dass allein das Einbinden dieser Datei zu einem erheblichen Leistungs-Overhead führt. Dies ist nur zu Debugging-Zwecken. Verwenden Sie dies nicht in der Produktion. [Feature #17762] -
Ausnahmen, die in Finalizern ausgelöst werden, werden nun auf
STDERRgedruckt, es sei denn,$VERBOSEistnil. [Feature #17798] -
ruby -run -e httpdzeigt URLs zum Zugriff an. [Feature #17847] -
Fügt
ruby -run -e colorizehinzu, um Ruby-Code mitIRB::Color.colorize_codezu kolorieren.