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.

``` 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](https://github.com/ruby/rbs) 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.

``` ruby
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](https://github.com/ruby/ruby/blob/master/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`](https://github.com/socketry/async/pull/56) steht ein Test-Scheduler zur Verfügung.
Siehe [`doc/scheduler.md`](https://github.com/ruby/ruby/blob/master/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.

  ``` ruby
  fib(10) => x
  p x #=> 55
  ```

* End-lose Methodendefinition wird eingeführt.

  ``` ruby
  def square(x) = x * x
  ```

* Find-Idiom wird eingeführt.

  ``` ruby
  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.

  ``` ruby
  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](https://www.ruby-lang.org/de/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/) für weitere
    Details.
  * Übrigens unterstützt Argumentweiterleitung jetzt auch vorangehende
    Argumente.

    ``` ruby
    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](https://github.com/ruby/ruby/blob/v3_0_0_preview1/NEWS.md) oder die [commit logs](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1) für weitere Details.



Mit diesen Änderungen wurden [3385 Dateien geändert, 150159 Einfügungen(+), 124949 Löschungen(-)](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1)
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"](https://github.com/mame/ruby-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.
