Geschrieben von naruse am 25.9.2020
Übersetzt von Marvin Gülker
Wir freuen uns, die Veröffentlichung von Ruby 3.0.0-preview1 ankündigen zu können.
Sie führt eine Reihe neuer Features und Performanzverbesserungen ein.
RBS
Mithilfe von RBS lassen sich die Typen eines Ruby-Programms beschreiben. Typprüfungsprogramme wie type-profiler und andere Werkzeuge mit RBS-Unterstützung werden mithilfe von RBS-Definitionen viel besser in der Lage sein, Ruby-Programme zu verstehen.
Mit RBS ist es nun möglich, die Definitionen von Klassen und Modulen zu beschrieben: Methoden der Klasse, Instanzvariablen und ihre Typen, Vererbungs- und Mix-In-Beziehungen.
RBS soll übliche Ruby-Idiome unterstützen und erlauben, komplexe Typen wie Union Types, überladene Methoden und Generics zu schreiben. RBS unterstützt mithilfe von Schnittstellen-Typen (Interface Types) auch Duck Typing.
Ruby 3.0 enthält das Gem rbs
, das das Parsing und die Verarbeitung
von in RBS geschriebenen Typendefinitionen ermöglicht.
Nachfolgend ein kleines Beispiel von RBS.
module ChatApp
VERSION: String
class Channel
attr_reader name: String
attr_reader messages: Array[Message]
attr_reader users: Array[User | Bot] # `|` bedeutet Union Types, `User` oder `Bot`.
def initialize: (String) -> void
def post: (String, from: User | Bot) -> Message # Methodenüberladung wird unterstützt.
| (File, from: User | Bot) -> Message
end
end
Siehe die README des rbs-Gem für weitere Informationen.
Ractor (experimentell)
Ractor ist eine dem Aktorenmodell ähnliche Abstraktion für Nebenläufigkeit, um die parallele Ausführung von Code bei gleichzeitiger Beachtung von Thread-Sicherheit zu ermöglichen.
Sie können mehrere Ractors anlegen und sie parallel ausführen. Ractor ermöglicht es, thread-sichere parallele Programme zu schreiben, weil sich Ractors normale Objekte nicht teilen können. Die Kommunikation zwischen Ractors wird stattdessen über Nachrichten abgewickelt.
Um das Teilen von Objekten zu begrenzen, führt Ractor einige Beschränkungen für Rubys Syntax ein (die allerdings nicht eingreifen, wenn nicht mehrere Ractors verwendet werden).
Die Spezifikation und Implementation sind noch nicht abgeschlossen und können sich in Zukunft noch ändern, weshalb dieses Feature als experimentell markiert ist und bei Erstellung eines Ractors eine entsprechende Warnung ausgegeben wird.
Das folgende kleine Programm berechnet prime?
parallel mit zwei
Ractors und ist, wenn zwei oder mehr Prozessorkerne vorhanden sind,
damit etwa 2-mal so schnell wie ein sequentielles Programm.
require 'prime'
# n.prime? wird mit den gesendeten Integern in r1, r2 parallel ausgeführt
r1, r2 = *(1..2).map do
Ractor.new do
n = Ractor.recv
n.prime?
end
end
# Parameter abschicken
r1.send 2**61 - 1
r2.send 2**61 + 15
# Warte auf die Ergebnisse von expr1, expr2
p r1.take #=> true
p r2.take #=> true
Siehe doc/ractor.md für weitere Informationen.
Scheduler (Experimentell)
Zur Unterbrechung blockender Operationen wird Thread#scheduler
eingeführt. Das ermöglicht leichtgewichtige Nebenläufigkeit ohne
Änderungen bestehenden Codes.
Momentan unterstützte Klassen/Methoden:
Mutex#lock
,Mutex#unlock
,Mutex#sleep
ConditionVariable#wait
Queue#pop
,SizedQueue#push
Thread#join
Kernel#sleep
IO#wait
,IO#read
,IO#write
und verwandte Methoden (z.B.#wait_readable
,#gets
,#puts
usw.).IO#select
wird nicht unterstützt.
Der momentane Eintrittspunkt für Nebenläufigkeit ist
Fiber.schedule{...}
. Das kann sich aber bis zur Veröffentlichung von
Ruby 3 noch ändern.
Mit Async::Scheduler
steht ein Test-Scheduler zur Verfügung.
Siehe doc/scheduler.md
für weitere Informationen. [Feature #16786]
ACHTUNG: Diese Feature ist sehr experimentell. Sowohl der Name als auch das Feature selbst werden sich in der nächsten Vorschau-Veröffentlichung ändern.
Sonstige erwähnenswerte neue Features
-
Rechtsbündige Zuweisungsanweisung wird eingeführt.
fib(10) => x p x #=> 55
-
End-lose Methodendefinition wird eingeführt.
def square(x) = x * x
-
Find-Idiom wird eingeführt.
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
-
Hash#except
ist jetzt eingebaut.h = { a: 1, b: 2, c: 3 } p h.except(:a) #=> {:b=>2, :c=>3}
-
Memory View wird als experimentelles Feature eingeführt.
- Dabei handelt es sich um ein neues C-API, das den Austausch roher Speicherabschnitte, wie ein numerisches Array oder Bitmap-Bilder, zwischen Erweiterungsbibliotheken (C extensions) ermöglichen soll. Die Erweiterungsbibliotheken können auch die Metadaten des betroffenen Speicherabschnitts wie etwa Schnitt, Elementformat usw. teilen. Mit dieser Art von Metadaten können Erweiterungsbibliotheken sogar mehrdimensionale Arrays ordnungsgemäß teilen. Dieses Feature orientiert sich an Pythons Buffer Protocol.
Performanzverbesserungen
- Es gab viele Verbesserungen im MJIT. Siehe die NEWS für Details.
Sonstige erwähnenswerte Änderungen seit 2.7
-
Schlüsselwortargumente werden von anderen Argumenten abgetrennt.
- Grundsätzlich wird Code, der unter Ruby 2.7 eine Warnung erzeugte, nicht mehr funktionieren. Siehe dieses Dokument für weitere Details.
-
Übrigens unterstützt Argumentweiterleitung jetzt auch vorangehende Argumente.
def method_missing(meth, ...) send(:"do_#{ meth }", ...) end
-
Die Besonderheiten von
$SAFE
wurde vollständig entfernt. Es handelt sich nun um eine normale globale Variable. -
In Ruby 2.5 war die Reihenfolge der Backtraces umgekehrt worden. Diese Änderung ist rückgängig gemacht worden, d.h. die Fehlermeldung und die Nummer der Zeile, in der der Fehler auftrat, werden zuerst und die Aufrufer danach ausgegeben.
- Einige Standardbibliotheken wurden aktualisiert.
- RubyGems 3.2.0.rc.1
- Bundler 2.2.0.rc.1
- IRB 1.2.6
- Reline 0.1.5
- Die folgenden Bibliotheken werden nicht länger mitgeliefert.
Installieren Sie die entsprechenden Gems, um diese Features zu
nutzen.
- net-telnet
- xmlrpc
- Die folgenden Standardbibliotheken werden zu mitgelieferten Gems
aufgewertet.
- rexml
- rss
- Werte die stdlib zu mitgelieferten Gems auf. Die folgenden Gems
wurden auf rubygems.org veröffentlicht:
- abbrev
- base64
- English
- erb
- find
- io-nonblock
- io-wait
- net-ftp
- net-http
- net-imap
- net-protocol
- nkf
- open-uri
- optparse
- resolv
- resolv-replace
- rinda
- securerandom
- set
- shellwords
- tempfile
- time
- tmpdir
- tsort
- weakref
Siehe die NEWS oder die commit logs für weitere Details.
Mit diesen Änderungen wurden 3385 Dateien geändert, 150159 Einfügungen(+), 124949 Löschungen(-) seit Ruby 2.7.0!
Bitte probieren Sie Ruby 3.0.0-preview1 aus und geben Sie uns Rückmeldung!
Download
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2
SIZE: 15538340 SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4 SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz
SIZE: 17747808 SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202 SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105 SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz
SIZE: 12703060 SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56 SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip
SIZE: 22002645 SHA1: 4b5b61066373daf0a947d3fafe2645788504a164 SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
3.0.0-preview2 Vorankündigung
Wir planen, “type-profiler”, ein Feature zur statischen Typanalyse, mitzuliefern. Wir halten Sie auf dem Laufenden!
Was ist Ruby
Ruby wurde zunächst 1993 von Matz (Yukihiro Matsumoto) entwickelt und ist heute quelloffene Software. Es läuft auf mehreren Plattformen und wird weltweit genutzt, insbesondere für die Webentwicklung.