NEWS für Ruby 2.6.0
Dieses Dokument ist eine Liste der für Benutzer sichtbaren Funktionsänderungen zwischen den Versionen, mit Ausnahme von Fehlerbehebungen.
Beachten Sie, dass jeder Eintrag so kurz gehalten wird, dass kein Grund oder Referenzinformationen angegeben werden. Eine vollständige Liste der Änderungen mit allen erforderlichen Informationen finden Sie in der Datei ChangeLog oder auf Redmine (z.B. https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)
Änderungen seit der Veröffentlichung von 2.5.0
Sprachänderungen
-
$SAFEist jetzt ein prozessglobaler Zustand und kann wieder auf 0 gesetzt werden. [Feature #14250] -
Refinements finden beim Block-Passing statt. [Feature #14223]
-
Refinements finden bei Kernel#public_send statt. [Feature #15326]
-
Refinements finden bei Kernel#respond_to? statt. [Feature #15327]
-
elseohnerescueverursacht jetzt einen Syntaxfehler. [EXPERIMENTAL] [Feature #14606] -
Konstantennamen dürfen mit einem nicht-ASCII-Großbuchstaben beginnen. [Feature #13770]
-
Endless Ranges werden eingeführt. Sie können einen
Rangeverwenden, der kein Ende hat, wie z. B.(0..)(oder ähnlich(0...)). [Feature #12912]Das Folgende zeigt typische Anwendungsfälle
ary[1..] # identical to ary[1..-1] (1...).each {|index| block } # infinite loop from index 1 ary.zip(1..) {|elem, index| block } # ary.each.with_index(1) { }
-
Nicht-Symbolschlüssel in einem Keyword-Arguments-Hash verursachen eine Ausnahme.
-
Die Warnung „schattierendes äußeres lokales Variablen“ wird entfernt. [Feature #12490]
Sie können jetzt Folgendes ohne Warnung schreiben
user = users.find {|user| cond(user) }
-
Gibt die
causeder Ausnahme aus, wenn die Ausnahme nicht abgefangen und ihre Backtraces und Fehlermeldung ausgegeben werden. [Feature #8257] -
Die Flip-Flop-Syntax wird als veraltet markiert. [Feature #5400]
Aktualisierungen von Core-Klassen (nur die wichtigsten)
Array- Neue Methoden
-
Instanzmethoden
Array#unionundArray#differencehinzugefügt. [Feature #14097]
-
- Modifizierte Methode
-
Array#to_hakzeptiert jetzt einen Block, der Elemente auf neue Schlüssel/Werte-Paare abbildet. [Feature #15143]
-
- Alias-Methoden
-
Array#filterist ein neuer Alias fürArray#select. [Feature #13784] -
Array#filter!ist ein neuer Alias fürArray#select!. [Feature #13784]
-
Binding- Neue Methode
-
Binding#source_locationhinzugefügt. [Feature #14230]Diese Methode gibt den Quellort der Bindung zurück, ein 2-Element-Array von
__FILE__und__LINE__. Traditionell konnten dieselben Informationen übereval("[__FILE__, __LINE__]", binding)abgerufen werden, aber wir planen, dieses Verhalten zu ändern, sodassKernel#evalden Quellort der Bindung ignoriert [Bug #4352]. Daher sollten Benutzer diese neu eingeführte Methode anstelle vonKernel#evalverwenden.
-
Dir- Neue Methoden
-
Instanzmethoden
Dir#each_childundDir#childrenhinzugefügt. [Feature #13969]
-
Enumerable- Neue Methode
-
Enumerable#chaingibt ein Enumerator-Objekt zurück, das nacheinander über die Elemente des Receivers und dann über die jedes Arguments iteriert. [Feature #15144]
-
- Modifizierte Methode
-
Enumerable#to_hakzeptiert jetzt einen Block, der Elemente auf neue Schlüssel/Werte-Paare abbildet. [Feature #15143]
-
- Alias-Methode
-
Enumerable#filterist ein neuer Alias fürEnumerable#select. [Feature #13784]
-
Enumerator::ArithmeticSequence-
Dies ist eine neue Klasse zur Darstellung eines Generators einer arithmetischen Folge, d. h. einer Zahlenfolge, die durch eine gemeinsame Differenz definiert ist. Sie kann verwendet werden, um etwas Ähnliches wie Pythons Slices darzustellen. Sie können eine Instanz dieser Klasse von
Numeric#stepundRange#steperhalten.
-
Enumerator::Chain-
Dies ist eine neue Klasse zur Darstellung einer Kette von Enumerable-Objekten, die als ein einzelner Enumerator fungiert und von Methoden wie
Enumerable#chainundEnumerator#+generiert wird.
-
Enumerator::Lazy- Alias-Methode
-
Enumerator::Lazy#filterist ein neuer Alias fürEnumerator::Lazy#select. [Feature #13784]
-
Enumerator- Neue Methoden
-
Enumerator#+gibt ein Enumerator-Objekt zurück, das über die Elemente des Receivers und dann über die des anderen Operanden iteriert. [Feature #15144]
-
ENV- Modifizierte Methode
-
ENV.to_hakzeptiert jetzt einen Block, der Namen und Werte auf neue Schlüssel und Werte abbildet. [Feature #15143]
-
Exception- Neue Optionen
-
Exception#full_messagenimmt die Optionen:highlightund:orderentgegen. [Bug #14324]
-
Hash- Modifizierte Methoden
-
Hash#merge,Hash#merge!undHash#updateakzeptieren jetzt mehrere Argumente. [Feature #15111] -
Hash#to_hakzeptiert jetzt einen Block, der Schlüssel und Werte auf neue Schlüssel und Werte abbildet. [Feature #15143]
-
- Alias-Methoden
-
Hash#filterist ein neuer Alias fürHash#select. [Feature #13784] -
Hash#filter!ist ein neuer Alias fürHash#select!. [Feature #13784]
-
IO- Neue Option
-
Neuer Modus-Charakter
'x'zum Öffnen von Dateien für exklusiven Zugriff hinzugefügt. [Feature #11258]
-
Kernel- Alias-Methode
-
Kernel#thenist ein neuer Alias fürKernel#yield_self. [Feature #14594]
-
- Neue Optionen
-
Kernel#Complex,Kernel#Float,Kernel#IntegerundKernel#Rationalnehmen eine Option:exceptionentgegen, um die Art der Fehlerbehandlung anzugeben. [Feature #12732] -
Kernel#systemnimmt eine Option:exceptionentgegen, um bei einem Fehler eine Ausnahme auszulösen. [Feature #14386]
-
- Inkompatible Änderungen
-
Kernel#systemundKernel#execschließen keine nicht standardmäßigen Dateideskriptoren (der Standardwert der Option:close_othersist auffalsegeändert, aber wir setzen immer noch dasFD_CLOEXEC-Flag auf Deskriptoren, die wir erstellen). [Misc #14907]
-
KeyError- Neue Optionen
-
KeyError.newakzeptiert die Optionen:receiverund:key, um den Receiver und den Schlüssel im Ruby-Code zu setzen. [Feature #14313]
-
- Method
- Module
- Modifizierte Methoden
-
Module#method_defined?,Module#private_method_defined?undModule#protected_method_defined?akzeptieren jetzt den zweiten Parameter als optional. Wenn diesertrue(der Standardwert) ist, werden Vorfahren-Module/Klassen geprüft, andernfalls wird nur die Klasse selbst geprüft. [Feature #14944]
-
NameError- Neue Option
-
NameError.newakzeptiert eine Option:receiver, um den Receiver im Ruby-Code zu setzen. [Feature #14313]
-
NilClass- Neue Methode
-
NilClass#=~wird zur Kompatibilität hinzugefügt. [Feature #15231]
-
NoMethodError- Neue Option
-
NoMethodError.newakzeptiert eine Option:receiver, um den Receiver im Ruby-Code zu setzen. [Feature #14313]
-
Numeric- Inkompatible Änderungen
-
Numeric#stepgibt jetzt eine Instanz der KlasseEnumerator::ArithmeticSequencezurück und nicht eine der KlasseEnumerator.
-
OpenStruct- Modifizierte Methode
-
OpenStruct#to_h akzeptiert jetzt einen Block, der Schlüssel und Werte auf neue Schlüssel und Werte abbildet. [Feature #15143]
-
ProcRandom- Neue Methode
-
Random.byteshinzugefügt. [Feature #4938]
-
Range- Neue Methode
-
Instanzmethode
Range#%hinzugefügt. [Feature #14697]
-
- Inkompatible Änderungen
-
Range#===verwendet jetzt cover? anstelle der Methode include?. [Feature #14575] -
Range#cover?akzeptiert jetzt einRange-Objekt. [Feature #14473] -
Range#stepgibt jetzt eine Instanz der KlasseEnumerator::ArithmeticSequencezurück und nicht eine der KlasseEnumerator.
-
- Regexp/String
-
Unicode-Version von 10.0.0 auf 11.0.0 aktualisiert. [Feature #14802]
Dies beinhaltet eine Neufassung des Algorithmus für grapheme Cluster (/X/) und eine Sonderbehandlung für georgisches MTAVRULI bei
String#downcase. -
Emoji-Version von 5.0 auf 11.0.0 aktualisiert [Feature #14802]
-
RubyVM::AbstractSyntaxTree- Neue Methoden
-
RubyVM::AbstractSyntaxTree.parseanalysiert einen gegebenen String und gibt AST-Knoten zurück. [experimental] -
RubyVM::AbstractSyntaxTree.parse_fileanalysiert eine gegebene Datei und gibt AST-Knoten zurück. [experimental] -
RubyVM::AbstractSyntaxTree.ofgibt AST-Knoten des gegebenen Proc oder der Methode zurück. [experimental]
-
RubyVM- Neue Methode
-
RubyVM.resolve_feature_path identifiziert die Datei, die durch „require(feature)“ geladen wird. [experimental] [Feature #15230]
-
String-
String#cryptist jetzt als veraltet markiert. [Feature #14915]
- Neue Funktionen
-
String#splitübergibt jede Teilzeichenkette an den Block, wenn einer angegeben ist. [Feature #4780]
-
-
Struct- Modifizierte Methode
-
Struct#to_hakzeptiert jetzt einen Block, der Schlüssel und Werte auf neue Schlüssel und Werte abbildet. [Feature #15143]
-
- Alias-Methode
-
Struct#filterist ein neuer Alias fürStruct#select. [Feature #13784]
-
Time- Neue Funktionen
-
Time.newundTime#getlocalakzeptieren ein Zeitzonenobjekt sowie einen UTC-Offset-String.Time#+,Time#-und Time#succ bewahren auch die Zeitzone. [Feature #14850]
-
TracePoint- Neue Funktionen
-
Das Ereignis „script_compiled“ wird unterstützt. [Feature #15287]
-
- Neue Methoden
-
TracePoint#parameters[Feature #14694] -
TracePoint#instruction_sequence[Feature #15287] -
TracePoint#eval_script[Feature #15287]
-
- Modifizierte Methode
-
TracePoint#enableakzeptiert neue Schlüsselwörter „target:“ und „target_line:“. [Feature #15289]
-
Aktualisierungen von Stdlib (nur die wichtigsten)
BigDecimal-
Aktualisierung auf Version 1.4.0. Diese Version enthält mehrere Kompatibilitätsprobleme, siehe den Abschnitt Kompatibilitätsprobleme unten für Details.
- Modifizierte Methode
-
BigDecimal() akzeptiert das neue Schlüsselwort „exception:“ ähnlich wie Float().
-
- Hinweis zu den Unterschieden zwischen neueren Versionen
-
Sie möchten vielleicht die Unterschiede zwischen neueren Versionen von bigdecimal kennen. Bitte wählen Sie die passende Version von bigdecimal gemäß den folgenden Informationen aus.
-
1.3.5 hat
BigDecimal.newohne das Schlüsselwort „exception:“. Sie sehen die Deprecation-Warnung vonBigDecimal.new, wenn Sie die Option „-w“ angeben. BigDecimal(),BigDecimal.newund Object#to_d Methoden sind gleich. -
1.4.0 hat
BigDecimal.newmit dem Schlüsselwort „exception:“. Sie sehen immer die Deprecation-Warnung vonBigDecimal.new. Die Methode Object#to_d unterscheidet sich von BigDecimal() undBigDecimal.new. -
2.0.0 wird kurz nach der Veröffentlichung von Ruby 2.6.0 veröffentlicht. Diese Version wird die Methode
BigDecimal.newnicht mehr enthalten.
-
Bundler-
Bundlerwurde zur Standardbibliothek hinzugefügt. [Feature #12733] -
Verwendet 1.17.2, die neueste stabile Version.
-
Coverage-
Ein oneshot_lines-Modus wurde hinzugefügt. [Feature #15022]
Dieser Modus prüft, ob „jede Zeile mindestens einmal ausgeführt wurde“, anstatt „wie oft jede Zeile ausgeführt wurde“. Ein Hook für jede Zeile wird höchstens einmal ausgelöst, und nachdem er ausgelöst wurde, wird das Hook-Flag entfernt, d. h. er läuft mit Null-Overhead.
- Neue Optionen
-
Das Schlüsselwortargument
:oneshot_lineswurde zuCoverage.starthinzugefügt. -
Die Schlüsselwortargumente
:stopund:clearwurden zuCoverage.resulthinzugefügt. Wenncleartrue ist, werden die Zähler auf Null gesetzt. Wennstoptrue ist, wird die Coverage-Messung deaktiviert.
-
- Neue Methoden
-
Coverage.line_stub, eine einfache Hilfsfunktion, die den „Stub“ der Zeilenabdeckung aus einem gegebenen Quellcode erstellt.
-
- CSV
-
Upgrade auf 3.0.2. Dies beinhaltet Leistungsverbesserungen, insbesondere beim Schreiben. Das Schreiben ist etwa 2x schneller. Siehe github.com/ruby/csv/blob/master/NEWS.md.
-
ERB- Neue Optionen
-
Die Schlüsselwortargumente
:trim_modeund:eoutvarwurden zuERB.newhinzugefügt. Nicht-Schlüsselwortargumente außer dem ersten werden jetzt als weich veraltet markiert und werden entfernt, wenn Ruby 2.5 EOL wird. [Feature #14256] -
Die Option
-Sdes erb-Befehls ist veraltet und wird in der nächsten Version entfernt.
-
FileUtils- Neue Methoden
-
FileUtils#cp_lr. [Feature #4189]
-
- Matrix
- Neue Methoden
-
Matrix#antisymmetric?, Matrix#skew_symmetric?
-
Matrix#map!, Matrix#collect! [Feature #14151]
-
Matrix#[]=
-
Vector#map!, Vector#collect!
-
Vector#[]=
-
Net- Neue Optionen
-
Das Schlüsselwortargument
:write_timeoutwurde zuNet::HTTP.newhinzugefügt. [Feature #13396]
-
- Neue Methoden
-
Net::HTTP#write_timeoutundNet::HTTP#write_timeout=hinzugefügt. [Feature #13396]
-
- Neue Konstante
-
Net::HTTPClientException wurde hinzugefügt, um Net::HTTPServerException zu veraltet zu erklären, da ihr Name irreführend ist. [Bug #14688]
-
- NKF
-
Upgrade auf nkf v2.1.5
-
Psych-
Upgrade auf
Psych3.1.0
-
- RDoc
-
Wird etwa 2x schneller.
-
Verwendet SOURCE_DATE_EPOCH zur Generierung von Dateien.
-
Behebt die Zeilennummer der Methode, die verrutscht war.
-
Aktiviert
--width,--excludeund--line-numbers, die ignoriert wurden. -
Unterstützung für Blockquotes mit „>>>“ in der Standard-Markup-Notation hinzugefügt.
-
Unterstützung für „Raises“-Zeilen in TomDoc-Notation hinzugefügt.
-
Fehlerausgabe korrigiert.
-
Viele Parsing-Fehler behoben.
-
- REXML
-
Upgrade auf REXML 3.1.9. Siehe github.com/ruby/rexml/blob/master/NEWS.md.
- Einige XPath-Implementierungen verbessert
-
concat()-Funktion: Stringifiziert alle Argumente vor dem Verketten. -
string()-Funktion: Unterstützt den Kontextknoten. -
string()-Funktion: Unterstützt den Processing Instruction Node. -
Unterstützt die Syntax
"*:#{ELEMENT_NAME}"in XPath 2.0.
-
- Einige XPath-Implementierungen behoben
-
"//#{ELEMENT_NAME}[#{POSITION}]"-Fall -
string()-Funktion: Behebtfunction(document)gibt Knoten zurück, die außerhalb der Stammelemente liegen. -
"/ #{ELEMENT_NAME} "-Fall -
"/ #{ELEMENT_NAME} [ #{PREDICATE} ]"-Fall -
"/ #{AXIS}::#{ELEMENT_NAME}"-Fall -
"#{N}-#{M}"-Fall: Ein oder mehrere Leerzeichen waren vor"-"erforderlich -
"/child::node()"-Fall -
"#{FUNCTION}()/#{PATH}"-Fall -
"@#{ATTRIBUTE}/parent::"-Fall -
"name(#{NODE_SET})"-Fall
-
-
- RSS
- Neue Optionen
-
RSS::Parser.parse akzeptiert jetzt Optionen als
Hash. Die Optionen:validate,:ignore_unknown_elementund:parser_classsind verfügbar.
-
- RubyGems
-
Upgrade auf RubyGems 3.0.1
-
- Set
- Alias-Methode
-
Set#filter!ist ein neuer Alias fürSet#select!. [Feature #13784]
-
URI- Neue Konstante
-
URI::Filewurde hinzugefügt, um das URI-Schemafilezu verarbeiten. [Feature #14035]
-
Kompatibilitätsprobleme (ausgenommen Feature-Fehlerbehebungen)
Dir-
Dir.globmit einer durch'\0'getrennten Musterliste wird als veraltet markiert und ist jetzt eine Warnung. [Feature #14643]
-
File-
File.read,File.binread,File.write,File.binwrite,File.foreachundFile.readlinesrufen keine externen Befehle auf, selbst wenn der Pfad mit dem Pipe-Zeichen'|'beginnt. [Feature #14245]
-
Object-
Object#=~ ist veraltet. [Feature #15231]
-
Kompatibilitätsprobleme mit Stdlib (ausgenommen Fehlerbehebungen von Features)
-
Diese Standardbibliotheken wurden zu Standard-Gems befördert.
-
e2mmap
-
forwardable
-
irb
-
logger
-
matrix
-
mutex_m
-
ostruct
-
prime
-
rexml
-
rss
-
shell
-
sync
-
thwait
-
tracer
-
BigDecimal-
Die folgenden Methoden wurden entfernt.
-
BigDecimal.allocate
-
BigDecimal.ver
-
-
Jedes
BigDecimal-Objekt ist eingefroren. [Feature #13984] -
BigDecimal() parst den gegebenen String ähnlich wie Float().
-
String#to_d parst den Receiver-String ähnlich wie
String#to_f. -
BigDecimal.newwird in Version 2.0 entfernt.
-
Pathname-
Pathname#read,Pathname#binread,Pathname#write,Pathname#binwrite,Pathname#each_lineundPathname#readlinesrufen keine externen Befehle auf, selbst wenn der Pfad mit dem Pipe-Zeichen'|'beginnt. Dies folgt [Feature #14245].
-
Implementierungsverbesserungen
-
Beschleunigung von
Proc#call, da wir uns keine Sorgen mehr um$SAFEmachen müssen. [Feature #14318]Mit dem Benchmark
lc_fizzbuzz, derProc#calloft verwendet, können wir Verbesserungen von x1,4 messen. [Bug #10212] -
Beschleunigung von block.call, wobei
blockals Blockparameter übergeben wird. [Feature #14330]Ruby 2.5 verbessert die Leistung des Block-Passing. [Feature #14045]
Darüber hinaus verbessert Ruby 2.6 die Leistung des Aufrufs übergebener Blöcke.
-
Einführung einer ersten Implementierung eines JIT (Just-in-time)-Compilers. [Feature #14235] [experimental]
-
Die Befehlszeilenoption
--jitwurde hinzugefügt, um JIT zu aktivieren.--jit-verbose=1ist gut zur Inspektion. Sieheruby --helpfür weitere Optionen. -
Zur Generierung von Maschinencode verwendet dieser JIT-Compiler den C-Compiler, der zum Erstellen des Interpreters verwendet wird. Derzeit werden GCC, Clang und Microsoft Visual C++ dafür unterstützt.
-
Die Option
--disable-mjit-supportwurde zu configure hinzugefügt. Diese wurde für JIT-Debugging hinzugefügt, aber wenn Sie beim Erstellen einer Header-Datei für JIT einen Fehler erhalten, können Sie diese Option verwenden, um das Erstellen als Workaround zu überspringen. -
rb_waitpid wurde auf Unix-ähnlichen Plattformen neu implementiert, um die Kompatibilität mit für JIT erstellten Prozessen aufrechtzuerhalten [Bug #14867]
-
-
Erneuerung des VM-Generator-Skripts; macht die generierte VM optimierter. [GH-1779]
-
Thread-Cache wurde für pthreads-Plattformen aktiviert (fürThread.newundThread.start). [Feature #14757] -
Der Timer-Thread wurde für Plattformen mit POSIX-Timern eliminiert. [Misc #14937]
-
Transient Heap (theap) wird unterstützt. [Bug #14858] [Feature #14989]
theap ist ein verwalteter Heap für kurzlebige Speicherobjekte. Beispielsweise ist die Erstellung eines kleinen und kurzlebigen
Hash-Objekts 2x schneller. Mit dem rdoc-Benchmark haben wir eine Leistungsverbesserung von 6-7% gemessen. -
Native Implementierungen (arm32, arm64, ppc64le, win32, win64, x86, amd64) von Coroutinen zur deutlichen Verbesserung der Leistung von
Fiber. [Feature #14739]
Sonstige Änderungen
-
Auf macOS enthalten gemeinsam genutzte Bibliotheken keine vollständige Versionsnummer von Ruby mehr in ihren Namen. Dies beseitigt die Last für jede kleine Aktualisierung auf der Plattform, sodass Benutzer jede Erweiterungsbibliothek neu kompilieren müssen.
- Vorher
-
libruby.2.6.0.dylib
-
libruby.2.6.dylib -> libruby.2.6.0.dylib
-
libruby.dylib -> libruby.2.6.0.dylib
-
- Nachher
-
libruby.2.6.dylib
-
libruby.dylib -> libruby.2.6.dylib
-
-
misc/*.el-Dateien nach github.com/ruby/elisp extrahiert