NEWS für Ruby 2.7.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 keine Begründung oder Referenzinformationen angegeben werden. Für eine vollständige Liste der Änderungen mit allen ausreichenden Informationen siehe die Datei ChangeLog oder Redmine (z. B. https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER).
Änderungen seit der Veröffentlichung 2.6.0
Sprachänderungen
Pattern Matching
-
Pattern Matching wird als experimentelles Feature eingeführt. [Feature #14912]
case [0, [1, 2, 3]] in [a, [b, *c]] p a #=> 0 p b #=> 1 p c #=> [2, 3] end case {a: 0, b: 1} in {a: 0, x: 1} :unreachable in {a: 0, b: var} p var #=> 1 end case -1 in 0 then :unreachable in 1 then :unreachable end #=> NoMatchingPatternError json = <<END { "name": "Alice", "age": 30, "children": [{ "name": "Bob", "age": 2 }] } END JSON.parse(json, symbolize_names: true) in {name: "Alice", children: [{name: name, age: age}]} p name #=> "Bob" p age #=> 2 JSON.parse(json, symbolize_names: true) in {name: "Alice", children: [{name: "Charlie", age: age}]} #=> NoMatchingPatternError
-
Weitere Details finden Sie in den folgenden Folien
-
speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7
-
Beachten Sie, dass die Folien leicht veraltet sind.
-
-
Die Warnung bezüglich Pattern Matching kann mit der Option -W:no-experimental unterdrückt werden.
Die Spezifikation von Schlüsselwortargumenten wird für 3.0 geändert
-
Die automatische Konvertierung von Schlüsselwortargumenten und positionellen Argumenten wird veraltet und in Ruby 3 entfernt. [Feature #14183]
-
Wenn ein Methodenaufruf einen
Hashals letztes Argument übergibt, keine Schlüsselwörter übergibt und die aufgerufene Methode Schlüsselwörter akzeptiert, wird eine Warnung ausgegeben. Um den Hash weiterhin als Schlüsselwörter zu behandeln, fügen Sie einen doppelten Sternchenoperator hinzu, um die Warnung zu vermeiden und das korrekte Verhalten in Ruby 3 sicherzustellen.def foo(key: 42); end; foo({key: 42}) # warned def foo(**kw); end; foo({key: 42}) # warned def foo(key: 42); end; foo(**{key: 42}) # OK def foo(**kw); end; foo(**{key: 42}) # OK
-
Wenn ein Methodenaufruf Schlüsselwörter an eine Methode übergibt, die Schlüsselwörter akzeptiert, aber nicht genügend erforderliche positionelle Argumente übergibt, werden die Schlüsselwörter als letztes erforderliches positionelles Argument behandelt und eine Warnung ausgegeben. Übergeben Sie das Argument als Hash anstelle von Schlüsselwörtern, um die Warnung zu vermeiden und das korrekte Verhalten in Ruby 3 sicherzustellen.
def foo(h, **kw); end; foo(key: 42) # warned def foo(h, key: 42); end; foo(key: 42) # warned def foo(h, **kw); end; foo({key: 42}) # OK def foo(h, key: 42); end; foo({key: 42}) # OK
-
Wenn eine Methode bestimmte Schlüsselwörter akzeptiert, aber keinen Schlüsselwort-Splat, und ein Hash oder Schlüsselwort-Splat an die Methode übergeben wird, der sowohl
Symbol- als auch Nicht-Symbol-Schlüssel enthält, wird der Hash weiterhin aufgeteilt und eine Warnung ausgegeben. Sie müssen den aufrufenden Code aktualisieren, um separate Hashes zu übergeben, um das korrekte Verhalten in Ruby 3 sicherzustellen.def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
-
Wenn eine Methode keine Schlüsselwörter akzeptiert und mit Schlüsselwörtern aufgerufen wird, werden die Schlüsselwörter weiterhin als positioneller Hash behandelt, ohne Warnung. Dieses Verhalten wird in Ruby 3 weiterhin funktionieren.
def foo(opt={}); end; foo( key: 42 ) # OK
-
-
Nicht-Symbole sind als Schlüsselwortargumentschlüssel zulässig, wenn die Methode beliebige Schlüsselwörter akzeptiert. [Feature #14183]
-
Nicht-Symbol-Schlüssel in einem Schlüsselwortargumenthash waren in 2.6.0 verboten, sind aber jetzt wieder erlaubt. [Bug #15658]
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
-
-
**nilist in Methodendefinitionen zulässig, um explizit zu markieren, dass die Methode keine Schlüsselwörter akzeptiert. Der Aufruf einer solchen Methode mit Schlüsselwörtern führt zu einemArgumentError. [Feature #14183]def foo(h, **nil); end; foo(key: 1) # ArgumentError def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError def foo(h, **nil); end; foo("str" => 1) # ArgumentError def foo(h, **nil); end; foo({key: 1}) # OK def foo(h, **nil); end; foo({"str" => 1}) # OK
-
Das Übergeben eines leeren Schlüsselwort-Splat an eine Methode, die keine Schlüsselwörter akzeptiert, übergibt kein leeres Hash mehr, es sei denn, das leere Hash ist für einen erforderlichen Parameter notwendig, in diesem Fall wird eine Warnung ausgegeben. Entfernen Sie den doppelten Sternchenoperator, um weiterhin einen positionellen Hash zu übergeben. [Feature #14183]
h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}
-
Die oben genannten Warnungen können auch mit der Option -W:no-deprecated unterdrückt werden.
Nummerierte Parameter
-
Nummerierte Parameter als Standardblockparameter werden eingeführt. [Feature #4475]
[1, 2, 10].map { _1.to_s(16) } #=> ["1", "2", "a"] [[1, 2], [3, 4]].map { _1 + _2 } #=> [3, 7]
Sie können weiterhin eine lokale Variable namens
_1usw. definieren, und dies wird berücksichtigt, wenn sie vorhanden ist, löst aber eine Warnung aus._1 = 0 #=> warning: `_1' is reserved for numbered parameter; consider another name [1].each { p _1 } # prints 0 instead of 1
proc/lambda ohne Block ist veraltet
-
Proc.newundKernel#procohne Block in einer Methode, die mit einem Block aufgerufen wird, geben nun eine Warnung aus.def foo proc end foo { puts "Hello" } #=> warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
Diese Warnung kann mit der Option -W:no-deprecated unterdrückt werden.
-
Kernel#lambdaohne Block in einer Methode, die mit einem Block aufgerufen wird, löst eine Ausnahme aus.def bar lambda end bar { puts "Hello" } #=> tried to create Proc object without a block (ArgumentError)
Andere geringfügige Änderungen
-
Ein beginnloses Bereich wird experimentell eingeführt. Es könnte in
case, neuer Aufrufssequenz vonComparable#clamp, Konstanten und DSLs nützlich sein. [Feature #14799]ary[..3] # identical to ary[0..3] case RUBY_VERSION when ..."2.4" then puts "EOL" # ... end age.clamp(..100) where(sales: ..100)
-
Das Setzen von
$;auf einen Wert ungleichnilgibt nun eine Warnung aus. [Feature #14240] Dies schließt die Verwendung inString#splitein. Diese Warnung kann mit der Option -W:no-deprecated unterdrückt werden. -
Das Setzen von
$,auf einen Wert ungleichnilgibt nun eine Warnung aus. [Feature #14240] Dies schließt die Verwendung inArray#joinein. Diese Warnung kann mit der Option -W:no-deprecated unterdrückt werden. -
Gezeigte Here-Dokument-Identifikatoren müssen in derselben Zeile enden.
<<"EOS " # This had been warned since 2.4; Now it raises a SyntaxError EOS
-
Die Verworfenheit der Flip-Flop-Syntax wird zurückgenommen. [Feature #5400]
-
Kommentarzeilen können nun zwischen fließende Punkte gesetzt werden.
foo # .bar .baz # => foo.baz
-
Der Aufruf einer privaten Methode mit einem literalen
selfals Empfänger ist nun erlaubt. [Feature #11297] [Feature #16123] -
Modifier-Rescue arbeitet nun genauso für Mehrfachzuweisungen wie für Einzelzuweisungen. [Bug #8279]
a, b = raise rescue [1, 2] # Previously parsed as: (a, b = raise) rescue [1, 2] # Now parsed as: a, b = (raise rescue [1, 2])
-
yieldin der Singleton-Klassensyntax gibt nun eine Warnung aus. Dieses Verhalten wird bald veraltet sein. [Feature #15575].def foo class << Object.new yield #=> warning: `yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575] end end foo { p :ok }Diese Warnung kann mit der Option -W:no-deprecated unterdrückt werden.
-
Argumentweiterleitung durch
(...)wird eingeführt. [Feature #16253]def foo(...) bar(...) end
Alle Argumente an
foowerden anbarweitergeleitet, einschließlich Schlüsselwort- und Blockargumenten. Beachten Sie, dass die Klammern obligatorisch sind.bar ...wird als endlicher Bereich geparst. -
Zugriff und Zuweisung von
$SAFEgeben nun immer eine Warnung aus.$SAFEwird in Ruby 3.0 eine normale globale Variable sein. [Feature #16131] -
Object#{taint,untaint,trust,untrust}und verwandte Funktionen in der C-API haben keine Wirkung mehr (alle Objekte gelten immer als nicht "tainted") und geben nun in der ausführlichen Betriebsart eine Warnung aus. Diese Warnung wird selbst in der nicht-ausführlichen Betriebsart in Ruby 3.0 deaktiviert, und die Methoden und C-Funktionen werden in Ruby 3.2 entfernt. [Feature #16131] -
Refinements finden bei
Object#methodundModule#instance_methodstatt. [Feature #15373]
Kommandozeilenoptionen
Warning Option
Die Option -W wurde um ein folgendes : erweitert, um kategorisierte Warnungen zu verwalten. [Feature #16345] [Feature #16420]
-
Um Verwarnungen wegen Veralterung zu unterdrücken
$ ruby -e '$; = ""' -e:1: warning: `$;' is deprecated $ ruby -W:no-deprecated -e '$; = //'
-
Es funktioniert mit der Umgebungsvariable
RUBYOPT$ RUBYOPT=-W:no-deprecated ruby -e '$; = //'
-
Um Warnungen wegen experimenteller Features zu unterdrücken
$ ruby -e '0 in a' -e:1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby! $ ruby -W:no-experimental -e '0 in a'
-
Um beide über
RUBYOPTzu unterdrücken, setzen Sie durch Leerzeichen getrennte Werte$ RUBYOPT='-W:no-deprecated -W:no-experimental' ruby -e '($; = "") in a'
Siehe auch Warning in Aktualisierungen der Kernklassen.
Aktualisierungen von Core-Klassen (nur die wichtigsten)
Array- Neue Methoden
-
Hinzugefügt:
Array#intersection. [Feature #16155] -
Hinzugefügt:
Array#minmax, mit einer schnelleren Implementierung alsEnumerable#minmax. [Bug #15929]
-
Comparable- Geänderte Methode
-
Comparable#clampakzeptiert nun einRange-Argument. [Feature #14784]-1.clamp(0..2) #=> 0 1.clamp(0..2) #=> 1 3.clamp(0..2) #=> 2 # With beginless and endless ranges: -1.clamp(0..) #=> 0 3.clamp(..2) #=> 2
-
Complex- Neue Methode
-
Hinzugefügt:
Complex#<=>. Daher wird0 <=> 0ikeineNoMethodErrorauslösen. [Bug #15857]
-
DirEncoding- Neue Kodierung
-
Neue Kodierung CESU-8 hinzugefügt. [Feature #15931]
-
Enumerable- Neue Methoden
-
Hinzugefügt:
Enumerable#filter_map. [Feature #15323][1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
-
Hinzugefügt:
Enumerable#tally. [Feature #11076]["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
-
Enumerator- Neue Methoden
-
Hinzugefügt:
Enumerator.produce, um einenEnumeratoraus jeder benutzerdefinierten Datentransformation zu generieren. [Feature #14781]require "date" dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates dates.detect(&:tuesday?) #=> next Tuesday
-
Hinzugefügt:
Enumerator::Lazy#eager, das einen nicht-faulen Enumerator aus einem faulen Enumerator generiert. [Feature #15901]a = %w(foo bar baz) e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager p e.class #=> Enumerator p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
-
Hinzugefügt:
Enumerator::Yielder#to_proc, damit ein Yielder-Objekt direkt als Blockargument an eine andere Methode übergeben werden kann. [Feature #15618] -
Hinzugefügt:
Enumerator::Lazy#with_index, um faul zu sein. Zuvor warEnumerator::Lazy#with_indexnicht definiert, sodass es die Standardimplementierung vonEnumeratoraufgriff, die nicht faul war. [Bug #7877]("a"..).lazy.with_index(1) { |it, index| puts "#{index}:#{it}" }.take(3).force # => 1:a # 2:b # 3:c
-
Fiber- Neue Methode
-
Hinzugefügt:
Fiber#raise, das sich wieFiber#resumeverhält, aber eine Ausnahme in der wiederaufgenommenen Fiber auslöst. [Feature #10344]
-
File- Neue Methode
-
Hinzugefügt:
File.absolute_path?, um auf portable Weise zu prüfen, ob ein Pfad absolut ist oder nicht. [Feature #15868]File.absolute_path?("/foo") # => true (on *nix) File.absolute_path?("C:/foo") # => true (on Windows) File.absolute_path?("foo") # => false
-
- Geänderte Methode
-
File.extnamegibt nun einen Punkt-String für Namen zurück, die mit einem Punkt enden, auf Nicht-Windows-Plattformen. [Bug #15267]File.extname("foo.") #=> "."
-
FrozenError- Neue Methode
-
Hinzugefügt:
FrozenError#receiver, um das eingefrorene Objekt zurückzugeben, dessen Änderung versucht wurde. Um dieses Objekt beim Auslösen vonFrozenErrorin Ruby-Code zu setzen, akzeptiertFrozenError.neweine Option:receiver. [Feature #15751]
-
GC- Neue Methode
-
Hinzugefügt: GC.compact-Methode zum Kompaktieren des Heaps. Diese Funktion kompaktiert lebende Objekte im Heap, sodass weniger Seiten verwendet werden können und der Heap CoW-freundlicher (copy-on-write) sein kann. [Feature #15626]
Details zum Algorithmus und zu den Einschränkungen finden Sie hier: bugs.ruby-lang.org/issues/15626
-
IO- Neue Methode
-
Hinzugefügt:
IO#set_encoding_by_bom, um die BOM zu prüfen und die externe Kodierung festzulegen. [Bug #15210]
-
Integer- Geänderte Methode
-
Integer#[]unterstützt nun Bereichsoperationen. [Feature #8842]0b01001101[2, 4] #=> 0b0011 0b01001100[2..5] #=> 0b0011 0b01001100[2...6] #=> 0b0011 # ^^^^
-
- Method
- Geänderte Methode
-
Method#inspectzeigt mehr Informationen an. [Feature #14145]
-
- Module
- Neue Methoden
-
Hinzugefügt:
Module#const_source_location, um den Ort abzurufen, an dem eine Konstante definiert ist. [Feature #10771] -
Hinzugefügt:
Module#ruby2_keywordszum Markieren einer Methode als Übergabe von Schlüsselwortargumenten über einen regulären Argument-Splat, nützlich beim Delegieren aller Argumente an eine andere Methode, um mit älteren Ruby-Versionen abwärtskompatibel zu sein. [Bug #16154]
-
- Geänderte Methoden
-
Module#autoload?nimmt nun ein optionales Argumentinheritentgegen, wieModule#const_defined?. [Feature #15777] -
Module#namegibt nun immer einen eingefrorenenStringzurück. Der zurückgegebeneStringist für jedes Modul immer derselbe. Diese Änderung ist experimentell. [Feature #16150]
-
NilClass/TrueClass/FalseClass- Geänderte Methoden
-
NilClass#to_s,TrueClass#to_sundFalseClass#to_sgeben nun immer einen eingefrorenenStringzurück. Der zurückgegebeneStringist für jeden dieser Werte immer derselbe. Diese Änderung ist experimentell. [Feature #16150]
-
ObjectSpace::WeakMap- Geänderte Methode
-
ObjectSpace::WeakMap#[]=akzeptiert nun spezielle Objekte als Schlüssel oder Werte. [Feature #16035]
-
Proc- Neue Methode
-
Hinzugefügt:
Proc#ruby2_keywordszum Markieren des Procs als Übergabe von Schlüsselwortargumenten über einen regulären Argument-Splat, nützlich beim Delegieren aller Argumente an eine andere Methode oder einen anderen Proc, um mit älteren Ruby-Versionen abwärtskompatibel zu sein. [Feature #16404]
-
Range- Neue Methode
-
Hinzugefügt:
Range#minmax, mit einer schnelleren Implementierung alsEnumerable#minmax. Er gibt ein Maximum zurück, das nunRange#maxentspricht. [Bug #15807]
-
- Geänderte Methode
-
Range#===verwendet nunRange#cover?auch fürString-Argumente (in Ruby 2.6 wurde es vonRange#include?für alle Typen außer Strings geändert). [Bug #15449]
-
RubyVM- Entfernte Methode
-
RubyVM.resolve_feature_pathwurde zu$LOAD_PATH.resolve_feature_pathverschoben. [Feature #15903] [Feature #15230]
-
String- Unicode
-
Unicode-Version und Emoji-Version von 11.0.0 auf 12.0.0 aktualisiert. [Feature #15321]
-
Unicode-Version auf 12.1.0 aktualisiert, Unterstützung für U+32FF SQUARE ERA NAME REIWA hinzugefügt. [Feature #15195]
-
Unicode Emoji-Version auf 12.1 aktualisiert. [Feature #16272]
-
Symbol- Neue Methoden
-
Hinzugefügt:
Symbol#start_with?undSymbol#end_with?Methoden. [Feature #16348]
-
Time- Neue Methoden
-
Hinzugefügt:
Time#ceilMethode. [Feature #15772] -
Hinzugefügt:
Time#floorMethode. [Feature #15653]
-
- Geänderte Methode
-
Time#inspectist vonTime#to_sgetrennt und zeigt die Subsekunden der Zeit an. [Feature #15958]
-
UnboundMethod- Neue Methode
-
Hinzugefügt:
UnboundMethod#bind_callMethode. [Feature #15955]umethod.bind_call(obj, ...)ist semantisch äquivalent zuumethod.bind(obj).call(...). Dieses Idiom wird in einigen Bibliotheken verwendet, um eine überschriebene Methode aufzurufen. Die hinzugefügte Methode tut dasselbe ohne die Allokation eines Zwischenmethodenobjekts.class Foo def add_1(x) x + 1 end end class Bar < Foo def add_1(x) # override x + 2 end end obj = Bar.new p obj.add_1(1) #=> 3 p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2 p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
-
Warning- Neue Methoden
-
Hinzugefügt:
Warning.[]undWarning.[]=zur Verwaltung der Ausgabe/Unterdrückung bestimmter Warnungskategorien. [Feature #16345] [Feature #16420]
-
- $LOAD_PATH
- Neue Methode
-
Hinzugefügt:
$LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]
-
Aktualisierungen von Stdlib (nur die wichtigsten)
Bundler-
Upgrade auf
Bundler2.1.2. Siehe github.com/bundler/bundler/releases/tag/v2.1.2
-
CGI-
CGI.escapeHTMLwird 2-5x schneller, wenn mindestens ein Zeichen maskiert ist. Siehe github.com/ruby/ruby/pull/2226
-
- CSV
-
Upgrade auf 3.1.2. Siehe github.com/ruby/csv/blob/master/NEWS.md.
-
Date-
Date.jisx0301,Date#jisx0301undDate.parseunterstützen die neue japanische Ära. [Feature #15742]
-
Delegator-
Object#DelegateClassakzeptiert einen Block und evaluiert ihn im Kontext der zurückgegebenen Klasse, ähnlich wieClass.newundStruct.new.
-
ERB-
Das Marshaling von
ERB-Instanzen ist verboten.
-
- IRB
-
Einführung von Syntax-Highlighting, inspiriert vom Pry-Gem, für Quellzeilen von Binding#irb, REPL-Eingaben und Inspektionsausgaben einiger Kernobjektklassen.
-
Einführung des Mehrzeilenbearbeitungsmodus durch Reline.
-
Anzeige von Dokumentation bei Vervollständigung.
-
Automatische Einrückung und Speichern/Laden des Verlaufs sind standardmäßig aktiviert.
-
JSON-
Upgrade auf 2.3.0.
-
- Net::FTP
-
Hinzugefügt: Net::FTP#features zur Überprüfung verfügbarer Features und Net::FTP#option zum Aktivieren/Deaktivieren jedes einzelnen. [Feature #15964]
-
Net::HTTP-
Hinzugefügt: optionaler Parameter
ipaddrzuNet::HTTP#startzum Ersetzen der Adresse für die TCP/IP-Verbindung. [Feature #5180]
-
- Net::IMAP
-
Server Name Indication (SNI) Unterstützung hinzugefügt. [Feature #15594]
-
- open-uri
OptionParser-
Es werden nun „Meinten Sie?“ für unbekannte Optionen angezeigt. [Feature #16256]
test.rb
require "optparse" OptionParser.new do |opts| opts.on("-f", "--foo", "foo") {|v| } opts.on("-b", "--bar", "bar") {|v| } opts.on("-c", "--baz", "baz") {|v| } end.parse!
Beispiel
$ ruby test.rb --baa Traceback (most recent call last): test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption) Did you mean? baz bar
-
Pathname-
Pathname.globdelegiert nun 3 Argumente anDir.glob, um den Schlüsselwortparameterbasezu akzeptieren. [Feature #14405]
-
- Racc
-
Zusammenführung von 1.4.15 aus dem Upstream-Repository und Hinzufügung der Kommandozeilenschnittstelle von racc.
-
- Reline
-
Neues stdlib, das mit dem readline-stdlib kompatibel ist, aber in reinem Ruby implementiert ist. Es bietet auch einen Mehrzeilenbearbeitungsmodus.
-
- REXML
-
Upgrade auf 3.2.3. Siehe github.com/ruby/rexml/blob/master/NEWS.md.
-
- RSS
-
Upgrade auf RSS 0.2.8. Siehe github.com/ruby/rss/blob/master/NEWS.md.
-
- RubyGems
StringScanner-
Upgrade auf 1.0.3. Siehe github.com/ruby/strscan/blob/master/NEWS.md.
-
Kompatibilitätsprobleme (ausgenommen Feature-Fehlerbehebungen)
-
Die folgenden Bibliotheken sind keine gebündelten Gems mehr. Installieren Sie die entsprechenden Gems, um diese Funktionen nutzen zu können.
-
CMath (cmath gem)
-
Scanf (scanf gem)
-
Shell (shell gem)
-
Synchronizer (sync gem)
-
ThreadsWait (thwait gem)
-
E2MM (e2mmap gem)
-
Proc-
Das Format von
Proc#to_swurde geändert. [Feature #16101]
-
Range-
Range#minmaxiterierte früher über den Bereich, um das Maximum zu bestimmen. Nun verwendet es denselben Algorithmus wieRange#max. In seltenen Fällen (z. B. Bereiche von Floats oder Strings) kann dies zu unterschiedlichen Ergebnissen führen. [Bug #15807]
-
Kompatibilitätsprobleme mit Stdlib (ausgenommen Fehlerbehebungen von Features)
-
Standard-Gems fördern
-
Die folgenden Standard-Gems wurden auf rubygems.org veröffentlicht
-
benchmark
-
cgi
-
delegate
-
getoptlong
-
net-pop
-
net-smtp
-
open3
-
pstore
-
readline
-
readline-ext
-
singleton
-
-
Die folgenden Standard-Gems wurden nur für ruby-core veröffentlicht, aber noch nicht auf rubygems.org.
-
monitor
-
observer
-
timeout
-
tracer
-
uri
-
yaml
-
-
-
Das Gem did_you_mean wurde von einem gebündelten Gem zu einem Standard-Gem befördert.
- Pfadname
- profile.rb, Profiler__
-
Aus der Standardbibliothek entfernt. Es war seit Ruby 2.0.0 nicht mehr gepflegt.
-
Updates der C-API
-
Viele Funktionen vom Typ
*_kwwurden hinzugefügt, um festzulegen, ob das übergebene letzte Argument als Schlüsselwörter behandelt werden soll. Möglicherweise müssen Sie auf diese Funktionen umsteigen, um Warnungen zur Trennung von Schlüsselwortargumenten zu vermeiden und das korrekte Verhalten in Ruby 3 sicherzustellen. -
Das Zeichen
:in der rb_scan_args-Formatzeichenkette wird nun als Schlüsselwortargumente behandelt. Das Übergeben eines positionellen Hashes anstelle von Schlüsselwortargumenten löst eine Verwarnung aus. -
C-API-Deklarationen mit
ANYARGSwerden so geändert, dass sieANYARGSnicht mehr verwenden. Siehe github.com/ruby/ruby/pull/2404
Implementierungsverbesserungen
Fiber-
Auswahl verschiedener Coroutine-Implementierungen durch Verwendung von
--with-coroutine=, z. B.$ ./configure --with-coroutine=ucontext $ ./configure --with-coroutine=copy
-
Ersetzt den vorherigen Stack-Cache durch einen Fiber-Pool-Cache. Der Fiber-Pool weist viele Stacks in einem einzigen Speicherbereich zu. Die Stack-Allokation wird O(log N) und die Fiber-Erstellung amortisiert O(1). In Mikro-Benchmarks wurde eine Leistungssteigerung von etwa dem 10-fachen gemessen. github.com/ruby/ruby/pull/2224
-
File-
File.realpathverwendet nun auf vielen Plattformen realpath(3), was die Leistung erheblich verbessern kann. [Feature #15797]
-
Hash-
Datenstruktur von kleinen
Hash-Objekten geändert. [Feature #15602]
-
Monitor-
Die Klasse
Monitorist in C-Erweiterung geschrieben. [Feature #16255]
-
Thread-
Die VM-Stack-Speicherallokation wird nun mit dem nativen Thread-Stack kombiniert, was die Thread-Allokationsleistung verbessert und Allokationsfehler reduziert. In Mikro-Benchmarks wurde eine Leistungssteigerung von etwa dem 10-fachen gemessen.
-
- JIT
-
JIT-kompilierter Code wird zu weniger optimiertem Code neu kompiliert, wenn eine Optimierungsannahme ungültig wird.
-
Methoden-Inlining wird durchgeführt, wenn eine Methode als rein betrachtet wird. Diese Optimierung ist noch experimentell und viele Methoden werden noch NICHT als rein betrachtet.
-
Der Standardwert von
--jit-max-cachewird von 1.000 auf 100 geändert. -
Der Standardwert von
--jit-min-callswird von 5 auf 10.000 geändert.
-
RubyVM-
Der pro Aufruf tätige Methoden-Cache, der seit etwa 1.9 vorhanden ist, wurde verbessert: Die Cache-Trefferrate stieg von 89 % auf 94 %. Siehe github.com/ruby/ruby/pull/2583
-
RubyVM::InstructionSequence-
Die Methode
RubyVM::InstructionSequence#to_binarygeneriert kompilierte Binärdaten. Die Binärgröße wird reduziert. [Feature #16163]
-
Sonstige Änderungen
-
Die Unterstützung für die IA64-Architektur wurde entfernt. Hardware zum Testen war schwer zu finden, nativer Fiber-Code ist schwer zu implementieren, und es erhöhte die Komplexität des Interpreters erheblich. [Feature #15894]
-
Compiler werden nun aufgefordert, C99 zu unterstützen. [Misc #15347]
-
Details zu unserem Dialekt: bugs.ruby-lang.org/projects/ruby-master/wiki/C99
-
-
Das Upstream-Repository von Ruby wird von Subversion auf Git umgestellt.
-
Unterstützung für integrierte Methoden in Ruby mit der Syntax
_builtin. [Feature #16254]Einige Methoden sind in *.rb definiert (z. B. trace_point.rb). Zum Beispiel ist es einfach, eine Methode zu definieren, die Schlüsselwortargumente akzeptiert.