Geschrieben von naruse am 25.12.2019
Übersetzt von Marvin Gülker
Wir freuen uns, die Veröffentlichung von Ruby 2.7.0 bekannt geben zu können.
Sie enthält eine Anzahl neuer Funktionalitäten und Performanzverbesserungen, namentlich:
- Musterabgleiche
- Verbesserungen der interaktiven Kommandozeile (REPL)
- Defragmentierung für den GC (Campaction GC)
- Trennung der Positions- und der Schlüsselwortargumente
Musterabgleiche [Experimentell]
Musterabgleiche sind eine häufig genutzte Funktion funktionaler Programmiersprachen. Mit 2.7.0 werden sie als experimentell in die Programmiersprache Ruby eingeführt. #14912
Ein Musterabgleich untersucht das übergebene Objekt und weist seinen Wert dann zu, wenn er auf ein bestimmtes Muster passt.
require "json"
json = <<END
{
"name": "Alice",
"age": 30,
"children": [{ "name": "Bob", "age": 2 }]
}
END
case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
p age #=> 2
end
Weitere Details können Sie der Präsentation Musterabgleiche - Neue Funktion in Ruby 2.7 entnehmen.
Verbesserung der interaktiven Kommandozeile
Die mitgelieferte interaktive Kommandozeile irb
(REPL: Read-Eval-Print-Loop)
wird mehrzeiliges Editieren unterstützen. Dies wird mithilfe von
reline
, einer readline
-kompatiblen nur mit Ruby implementierten Bibliothek,
umgesetzt. Darüber hinaus wird irb
besser mit RDoc integriert: es
wird möglich, die Referenzdokumentation für eine bestimmte Klasse,
ein bestimmtes Modul oder auch eine bestimmte Methode nachzuschlagen.
[Feature #14683],
[Feature #14787],
[Feature #14918]
Schließlich werden von Binding.irb
angezeigte Quellcode-Zeilen und
Ergebnisse von inspect
farblich hevorgehoben werden.
Defragmentierender GC
Die neue Version wird einen defragmentierenden GC (Compaction GC) einführen, der fragmentierten Arbeitsspeicherplatz defragmentieren kann.
Einige Ruby-Programme, die mit mehreren Threads arbeiten, leiden derzeit unter Speicherfragmentierung. Dies verursacht einen hohen Speicherverbrauch und eine reduzierte Ausführungsgeschwindigkeit.
Zur Behebung des Problems wird die neue Methode GC.compact
eingeführt. Sie defragmentiert den Freispeicher (Heap), indem sie
noch aktive Objekte näher zusammenrückt, sodass weniger Speicherseiten
benötigt werden und der Freispeicher insgesamt besser für
Copy-on-Write (CoW) geeignet ist. #15626
Trennung von Positions- und Schlüsselwortargumenten
Die automatische Konvertierung zwischen Schlüsselwort- und Positionsargumenten gilt nun als veraltet und wird mit Ruby 3 entfernt werden. [Feature #14183]
Siehe den Artikel “Trennung von Positions- und Schlüsselwortargumenten in Ruby 3.0” für Details. Die Änderungen stellen sich wie folgt dar:
-
Wenn bei einem Methodenaufruf ein Hash als letztes Argument übergeben wird, wenn sonstige Argumente fehlen und wenn die aufgerufene Methode Schlüsselwortargumente annimmt, dann gibt Ruby eine Warnung aus. Um das Hash weiterhin als Schlüsselwortargument zu verwenden, ist es notwendig, den doppelten Auflösungsoperator (double splat operator) zu benutzen. Nur so kann die Warnung vermieden und das korrekte Verhalten in Ruby 3 sichergestellt werden.
def foo(key: 42); end; foo({key: 42}) # Warnung def foo(**kw); end; foo({key: 42}) # Warnung def foo(key: 42); end; foo(**{key: 42}) # OK def foo(**kw); end; foo(**{key: 42}) # OK
-
Wenn bei einem Methodenaufruf Schlüsselwortargumente an eine Methode, die auch Schlüsselwortargumente akzeptiert, übergeben werden, jedoch nicht genügend Schlüsselwortargumente bereitgestellt werden, dann werden die übergebenen Schlüsselwortargumente als finales erforderliches Positionsargument gewertet und eine Warnung wird ausgegeben. Übergeben Sie das Argument als Hash statt als Schlüsselwortargumentliste, um die Warnung zu vermeiden und korrektes Verhalten in Ruby 3 sicherzustellen.
def foo(h, **kw); end; foo(key: 42) # Warnung def foo(h, key: 42); end; foo(key: 42) # Warnung def foo(h, **kw); end; foo({key: 42}) # OK def foo(h, key: 42); end; foo({key: 42}) # OK
-
Wenn eine Methode bestimmte Schlüsselwortargumente, nicht aber den doppelten Auflösungsoperator verwendet, und ein Hash oder eine Schlüsselwortargumenteliste mit einer Mischung aus Strings und Symbolen übergeben wird, dann wird das Hash weiterhin aufgespalten. Zudem wird eine Warnung ausgegeben. Sie müssen für das korrekte Verhalten in Ruby 3 den aufrufenden Code so ändern, dass zwei einzelne Hashes übergeben werden.
def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # Warnung def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # Warnung def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
-
Wenn eine Methode keine Schlüsselwortargumente akzeptiert, aber mit solchen aufgerufen wird, werden solche Schlüsselwortargumente weiterhin ohne Warnung als Hash für ein Positionsargument interpretiert. Dieses Verhalten wird auch in Ruby 3 weiterhin beibehalten.
def foo(opt={}); end; foo( key: 42 ) # OK
-
Schlüsselwortargumente mit anderen Schlüsseln als Symbolen sind zulässig, wenn die Methode beliebige Schlüsselwortargumente akzeptiert. [Feature #14183]
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
-
**nil
kann genutzt werden, um in einer Methodendefinition ausdrücklich festzulegen, dass die Methode keine Schlüsselwörter akzeptiert. Der Aufruf einer solchen Methode mit Schlüsselwortargumenten erzeugt einen ArgumentError. [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
-
Die Übergabe einess leeren doppelten Auflösungsoperators an eine Methode, die keine Schlüsselwortargumente akzeptiert, führt nicht länger zur impliziten Übergabe eines leeren Hashes, es sei denn, das Hash ist wegen eines erforderlichen Parameters notwendig. In diesem Fall wird eine Warnung ausgegeben. Entfernen Sie den doppelten Auflösungsoperator, um ein Hash als Positionsargument zu übergeben. [Feature #14183]
h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} und Warnung h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}
Wenn Sie die Veraltungswarnungen unterdrücken wollen, verwenden Sie
bitte den Kommandozeilenschalter -W:no-deprecated
oder fügen Ihrem
Code den Befehl Warning[:deprecated] = false
hinzu.
Sonstige bemerkenswerte neue Funktionen
-
Blockparameter werden für abgekürzten Zugriff automatisch nummeriert. #4475
-
Es werden anfangslose Range-Objekte eingeführt. Diese sind vielleicht nicht so nützlich wie endlose Range-Objekte, könnten aber für domänenspezifische Sprachen praktisch sein. #14799
ary[..3] # identical to ary[0..3] rel.where(sales: ..100)
-
Enumerable#tally
wird hinzugefügt. Die Methode zählt das Vorkommen jedes Elements.["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1}
-
Es ist jetzt zulässig, eine private Methode auf dem Schlüsselwort
self
aufzurufen. [Feature #11297] [Feature #16123]def foo end private :foo self.foo
-
Enumerator::Lazy#eager
wird hinzugefügt. Diese Methode generiert einen nicht verzögertern Enumerator (non-lazy enumerator) aus einem verzögerten Enumerator (lazy enumerator). [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!?"]
Performanzverbesserungen
-
JIT [Experimentell]
-
JIT-kompilierter Code wird neu zu weniger optimiertem Code kompiliert, wenn eine Optimierungsannahme sich als falsch herausstellt.
-
Method-Inlining wird durchgeführt, wenn eine Methode als rein (pure) gilt. Diese Optimierung ist noch experimentell und zahlreiche Methoden gelten noch nicht als rein.
-
Der Standardwert von
--jit-min-calls
wird von 5 auf 10.000 geändert. -
Der Standardwert von
--jit-max-cache
wird von 1.000 auf 100 geändert.
-
-
Die Cache-Strategie von Fiber wurde verändert und die Erstellung von Fibers beschleunigt. GH-2224
-
Module#name
,true.to_s
,false.to_s
, undnil.to_s
geben jetzt immer einen eingefrorenen String zurück. Der zurückgegebene String ist für das jeweilige Objekt immer derselbe. [Experimenell] [Feature #16150] -
Die Performanz von
CGI.escapeHTML
wurde verbessert. GH-2226 -
Die Performanz von Monitor und MonitorMixin wurde verbessert. [Feature #16255]
-
Der aufruferspezifische Methoden-Cache, den es seit etwa 1.9 gibt, wurde verbessert: die Rückgriffsrate auf den Cache konnte von 89% auf 94% erhöht werden. Siehe GH-2583
-
Die Methode RubyVM::InstructionSequence#to_binary generiert kompilierten Binärcode. Die Größe des Binärcodes wurde reduziert. [Feature #16163]
Sonstige bemerkenswerte Änderungen seit 2.6
- Einige Standardbibliotheken werden aktualisiert.
- Bundler 2.1.2 (Veröffentlichungshinweise)
- RubyGems 3.1.2
- Racc 1.4.15
- CSV 3.1.2 (Neuigkeiten)
- REXML 3.2.3 (Neuigkeiten)
- RSS 0.2.8 (Neuigkeiten)
- StringScanner 1.0.3
- Es werden auch einige Bibliotheken aktualisiert, die nicht über eine eigenständige Versionsnummer verfügen.
-
Die folgenden Programmbibliotheken sind nicht länger als mitgelieferte Gems enthalten. Installieren Sie die entsprechenden Gems, um diese Features zu verwenden.
- CMath (Gem cmath)
- Scanf (Gem scanf)
- Shell (Gem shell)
- Synchronizer (Gem sync)
- ThreadsWait (Gem thwait)
- E2MM (Gem e2mmap)
-
profile.rb
wurde aus der Standardbibliothek entfernt. - Änderung von stdlib-Bibliotheken in Standard-Gems:
- Die folgenden Standard-Gems wurden auf rubygems.org veröffentlicht:
- benchmark
- cgi
- delegate
- getoptlong
- net-pop
- net-smtp
- open3
- pstore
- singleton
- Die folgenden Standard-Gems werden nur mit Rubys Kern, aber noch
nicht auf rubygems.org veröffentlicht:
- monitor
- observer
- timeout
- tracer
- uri
- yaml
- Die folgenden Standard-Gems wurden auf rubygems.org veröffentlicht:
-
Die Nutzung von
Proc.new
undproc
ohne Block in einer Methode, die einen Block erwartet, führt nun zu einer Warnung. -
Die Nutzung von
lambda
ohne block in einer Methode, die einen Block erwartet, erzeugt einen Fehler. -
Die Unicode- und Emoji-Version werden von 11.0.0 auf 12.0.0 angehoben. [Feature #15321]
-
Die Unicode-Version wird auf 12.1.0 angehoben, um Unterstützung für U+32FF SQUARE ERA NAME REIWA zu erhalten. [Feature #15195]
-
Date.jisx0301
,Date#jisx0301
, andDate.parse
unterstützen die neue japanische Ära. [Feature #15742] - Compiler müssen jetzt C99 unterstützen.
[Misc #15347]
- Details zum genutzten Dialekt: https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99
Siehe die NEWS oder die Commit-Logs für weitere Details.
Mit diesen Änderungen wurden 4190 Dateien geändert, 227498 Einfügungen(+), 99979 Löschungen(-) seit Ruby 2.6.0!
Frohe Weihnachten, schöne Ferien, und viel Spaß bei der Programmierung mit Ruby 2.7!
Download
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2
SIZE: 14703381 SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26 SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz
SIZE: 16799684 SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5 SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz
SIZE: 11990900 SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343 SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip
SIZE: 20571744 SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80 SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0 SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b
Was ist Ruby
Die Programmiersprache Ruby wurde 1993 von Yukihiro „Matz“ Matsumoto erfunden und wird heute als quelloffene Software entwickelt. Sie läuft auf verschiedenen Plattformen und wird überall auf der Welt namentlich für die Webentwicklung genutzt.