Ruby 3.0.0 Preview 2 veröffentlicht

Gepostet von naruse am 8. Dez 2020

Wir freuen uns, die Veröffentlichung von Ruby 3.0.0-preview2 bekannt zu geben.

Sie führt eine Reihe neuer Funktionen und Leistungsverbesserungen ein.

Statische Analyse

RBS

RBS ist eine Sprache zur Beschreibung der Typen von Ruby-Programmen.

Typprüfer, einschließlich TypeProf und anderer RBS-unterstützender Tools, werden Ruby-Programme mit RBS-Definitionen viel besser verstehen.

Sie können die Definition von Klassen und Modulen niederschreiben: Methoden, die in der Klasse definiert sind, Instanzvariablen und deren Typen sowie Vererbungs-/Mix-in-Beziehungen.

Ziel von RBS ist die Unterstützung gängiger Muster in Ruby-Programmen und ermöglicht das Schreiben fortgeschrittener Typen, einschließlich Union-Typen, Methodenüberladung und Generics. Es unterstützt auch Duck-Typing mit Interface-Typen.

Ruby 3.0 wird mit dem rbs Gem geliefert, das das Parsen und Verarbeiten von in RBS geschriebenen Typdefinitionen ermöglicht. Das Folgende ist ein kleines Beispiel für RBS mit Klassen-, Modul- und Konstanten-Definitionen.

module ChatApp
  VERSION: String
  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|` means union types, `User` or `Bot`.
    def initialize: (String) -> void
    def post: (String, from: User | Bot) -> Message   # Method overloading is supported.
            | (File, from: User | Bot) -> Message
  end
end

Weitere Details finden Sie in der README des rbs Gems.

TypeProf

TypeProf ist ein Typanalysetool, das im Ruby-Paket enthalten ist.

Derzeit dient TypeProf als eine Art Typinferenz.

Es liest normale (nicht typ-annotierte) Ruby-Code, analysiert, welche Methoden definiert sind und wie sie verwendet werden, und generiert einen Prototyp einer Signatur im RBS-Format.

Hier ist eine einfache Demo von TypeProf.

Ein Beispiel-Input

# test.rb
class User
  def initialize(name:, age:)
    @name, @age = name, age
  end
  attr_reader :name, :age
end
User.new(name: "John", age: 20)

Ein Beispiel-Output

$ typeprof test.rb
# Classes
class User
  attr_reader name : String
  attr_reader age : Integer
  def initialize : (name: String, age: Integer) -> [String, Integer]
end

Sie können TypeProf ausführen, indem Sie den Input als "test.rb" speichern und einen Befehl namens "typeprof test.rb" aufrufen.

Sie können TypeProf auch online ausprobieren. (Es führt TypeProf serverseitig aus, also sorry, wenn es nicht verfügbar ist!)

Weitere Details finden Sie in der Dokumentation und in den Demos.

TypeProf ist experimentell und noch nicht sehr ausgereift; nur eine Teilmenge der Ruby-Sprache wird unterstützt und die Erkennung von Typfehlern ist begrenzt. Aber es wächst immer noch rasant, um die Abdeckung von Sprachfunktionen, die Analyseleistung und die Benutzerfreundlichkeit zu verbessern. Jedes Feedback ist sehr willkommen.

Ractor (experimentell)

Ractor ist eine Actor-Model-ähnliche Konkurrenz-Abstraktion, die darauf ausgelegt ist, eine parallele Ausführungsfunktion ohne Bedenken hinsichtlich der Thread-Sicherheit bereitzustellen.

Sie können mehrere Raktoren erstellen und diese parallel ausführen. Ractor ermöglicht es Ihnen, threadsichere Parallelprogramme zu erstellen, da Raktoren keine normalen Objekte teilen können. Die Kommunikation zwischen Raktoren wird durch Nachrichtenübermittlung unterstützt.

Um das Teilen von Objekten zu begrenzen, führt Ractor mehrere Einschränkungen für die Ruby-Syntax ein (ohne mehrere Raktoren gibt es keine Einschränkung).

Die Spezifikation und Implementierung sind nicht ausgereift und können sich in Zukunft ändern, daher ist diese Funktion als experimentell gekennzeichnet und zeigt die Warnung "experimentelle Funktion" an, wenn der erste Ractor.new aufgerufen wird.

Das folgende kleine Programm berechnet n.prime? (n ist eine relativ große Ganzzahl) parallel mit zwei Raktoren. Sie werden bestätigen, dass die Programmausführung auf einem parallelen Computer etwa doppelt so schnell ist wie die sequenzielle.

require 'prime'
# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end
# send parameters
r1.send 2**61 - 1
r2.send 2**61 + 15
# wait for the results of expr1, expr2
p r1.take #=> true
p r2.take #=> true

Weitere Details finden Sie in doc/ractor.md.

Fiber Scheduler

Fiber#scheduler wird zur Abfangung blockierender Operationen eingeführt. Dies ermöglicht leichte Konkurrenz, ohne bestehenden Code ändern zu müssen. Sehen Sie sich "Don’t Wait For Me, Scalable Concurrency for Ruby 3" für einen Überblick über die Funktionsweise an.

Derzeit unterstützte Klassen/Methoden

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • Process.wait
  • IO#wait, IO#read, IO#write und verwandte Methoden (z. B. #wait_readable, #gets, #puts usw.).
  • IO#select wird *nicht unterstützt*. (Async Gem mit Links erklären). Dieses Beispielprogramm führt mehrere HTTP-Anfragen gleichzeitig durch: (Dies erklären:)
    1. async ist ein externes Gem
    2. async nutzt diese neue Funktion
require 'async'
require 'net/http'
require 'uri'
Async do
  ["ruby", "python", "c"].each do |topic|
    Async do
      Net::HTTP.get(URI "https://www.google.com/search?q=#{topic}")
    end
  end
end

Weitere bemerkenswerte neue Funktionen

  • Die Einzeilen-Pattern-Matching verwendet nun => anstelle von in.
      # version 3.0
      {a: 0, b: 1} => {a:}
      p a # => 0
      # version 2.7
      {a: 0, b: 1} in {a:}
      p a # => 0
    
  • Find-Muster wurde hinzugefügt.
      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
    
  • Endless-Methodendefinition wurde hinzugefügt.
      def square(x) = x * x
    
  • Hash#except ist jetzt integriert.
      h = { a: 1, b: 2, c: 3 }
      p h.except(:a) #=> {:b=>2, :c=>3}
    
  • Memory View wird als experimentelle Funktion hinzugefügt
    • Dies ist ein neuer C-API-Satz zum Austausch eines Rohspeicherbereichs, wie z. B. eines numerischen Arrays und eines Bitmap-Bildes, zwischen Erweiterungsbibliotheken. Die Erweiterungsbibliotheken können auch die Metadaten des Speicherbereichs austauschen, die Form, das Elementformat und so weiter umfassen. Mithilfe dieser Metadaten können die Erweiterungsbibliotheken sogar mehrdimensionale Arrays angemessen austauschen. Diese Funktion wurde in Anlehnung an das Pufferprotokoll von Python entworfen.

Leistungsverbesserungen

  • Viele Verbesserungen wurden in MJIT implementiert. Siehe NEWS im Detail.
  • Das Einfügen langer Codeschnipsel in IRB ist 53 Mal schneller als bei Ruby 2.7.0. Zum Beispiel geht die benötigte Zeit, um diesen Beispielcode einzufügen, von 11,7 Sekunden auf 0,22 Sekunden herunter.

Weitere bemerkenswerte Änderungen seit 2.7

  • Schlüsselwortargumente wurden von anderen Argumenten getrennt.
    • Grundsätzlich funktioniert Code, der unter Ruby 2.7 eine Warnung ausgibt, nicht mehr. Lesen Sie das Dokument im Detail.
    • Übrigens unterstützt die Argumentenweiterleitung jetzt führende Argumente.
      def method_missing(meth, ...)
        send(:"do_#{ meth }", ...)
      end
      
  • Das $SAFE Feature wurde vollständig entfernt; es ist jetzt eine normale globale Variable.
  • Die Reihenfolge des Backtraces wurde in Ruby 2.5 umgekehrt und wiederhergestellt. Jetzt verhält es sich wie Ruby 2.4; eine Fehlermeldung und die Zeilennummer, an der die Ausnahme auftritt, werden zuerst ausgegeben, und seine Aufrufer werden später 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 sind keine gebündelten Gems mehr. Installieren Sie die entsprechenden Gems, um diese Funktionen zu nutzen.
    • net-telnet
    • xmlrpc
  • Die folgenden Standard-Gems sind nun gebündelte Gems.
    • rexml
    • rss
  • Die folgenden Standardbibliotheksdateien sind nun Standard-Gems und werden 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

Weitere Details finden Sie in NEWS oder in den Commit-Logs.

Mit diesen Änderungen wurden seit Ruby 2.7.0 3776 Dateien geändert, 181573 Einfügungen (+), 145096 Löschungen (-)!

Bitte probieren Sie Ruby 3.0.0-preview2 aus und geben Sie uns Feedback!

Herunterladen

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.tar.gz

    SIZE: 19378626
    SHA1: 25363b20225850224e7835e99906c52f2ff57792
    SHA256: 9de8661565c2b1007d91a580e9a7e02d23f1e8fc8df371feb15a2727aa05fd9a
    SHA512: 6fa4191425ae71e41894b60bd9c31d483a562ee8216886360ce18238ab48115b95be0367708612c45f634e7584fba8940a524ba0113ce0f36ce4df78a112d0b7
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.tar.xz

    SIZE: 14244252
    SHA1: 54e4d3892ce480106382bd2d36dd7395e01b0f2a
    SHA256: 03078e82d4fb55c13837c69e56565fc49c451d11b1ca5e1b075d990d0957f181
    SHA512: 8b0e6e3ba7e5f95586b4438d965e7b09187ad599f4ac22dec3db7b176358514fe0c0890dde8912fef1ef92ffcde3f6f1228178eabadcf3a05601e5b6f05881ae
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.zip

    SIZE: 23907144
    SHA1: 064ee265c94b3df87e737622ba84437ea0d6aeaf
    SHA256: 19e295ae50934ddac2b366f0c7c8de9bd710d596b76eba02152f3641e5ce2b23
    SHA512: 598def50ef9e8ae1f44e05ff2c4e35acf252437286f08644ba5e301ebff2db399140bafa72868877100d6ffa736a4474cb7b99ecea8bdf835ed113ab250bb3d9
    

Was ist Ruby

Ruby wurde erstmals 1993 von Matz (Yukihiro Matsumoto) entwickelt und wird nun als Open Source entwickelt. Es läuft auf mehreren Plattformen und wird weltweit, insbesondere für die Webentwicklung, eingesetzt.

Aktuelle Nachrichten

Ruby 4.0.0 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0 bekannt zu geben. Ruby 4.0 führt „Ruby Box“ und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 25. Dez 2025

Ein neuer Look für Rubys Dokumentation

Nach dem Redesign von ruby-lang.org gibt es weitere Neuigkeiten zur Feier des 30-jährigen Jubiläums von Ruby: docs.ruby-lang.org hat ein komplett neues Erscheinungsbild mit Aliki – dem neuen Standard-Theme von RDoc.

Veröffentlicht von Stan Lo am 23. Dez 2025

Neues Website-Erscheinungsbild

Wir freuen uns, ein umfassendes Redesign unserer Website bekannt zu geben. Das Design für dieses Update wurde von Taeko Akatsuka erstellt.

Veröffentlicht von Hiroshi SHIBATA am 22. Dez 2025

Ruby 4.0.0 preview3 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0-preview3 bekannt zu geben. Ruby 4.0 führt Ruby::Box und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 18. Dez 2025

Weitere Neuigkeiten...