Ruby 3.0.0 RC1 veröffentlicht

Gepostet von naruse am 20. Dez 2020

Wir freuen uns, die Veröffentlichung von Ruby 3.0.0-rc1 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 ausgeliefert, 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 die Eingabe 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!)

Einzelheiten 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 Ihnen die Erstellung von threadsicheren parallelen Programmen, da Raktoren keine normalen Objekte gemeinsam nutzen können. Die Kommunikation zwischen Raktoren wird durch Nachrichtenübermittlung unterstützt.

Um die gemeinsame Nutzung von Objekten einzuschränken, führt Ractor mehrere Einschränkungen in die Ruby-Syntax ein (ohne mehrere Raktoren gibt es keine Einschränkung).

Die Spezifikation und Implementierung sind noch nicht ausgereift und können sich in Zukunft ändern. Daher ist diese Funktion als experimentell gekennzeichnet und zeigt beim ersten Ractor.new eine Warnung "experimentelle Funktion" an.

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

require 'prime'
# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.receive
    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 Einzelheiten 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*.

(Erklären Sie das Async-Gem mit Links). Dieses Beispielprogramm führt mehrere HTTP-Anfragen gleichzeitig durch

(Erklären Sie das:)

  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 einzeilige Mustererkennung wurde neu gestaltet. (experimentell)

    • => wurde hinzugefügt. Es kann wie eine Zuweisung nach rechts verwendet werden.

      0 => a
      p a #=> 0
      
      {b: 0, c: 1} => {b:}
      p b #=> 0
      
    • in gibt jetzt true oder false zurück.

      # version 3.0
      0 in 1 #=> false
      
      # version 2.7
      0 in 1 #=> raise NoMatchingPatternError
      
  • Mustererkennung (Find-Pattern) wurde hinzugefügt. (experimentell)

    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 von langem Code in IRB ist 53-mal schneller als bei Ruby 2.7.0. Zum Beispiel sinkt die Zeit, die zum Einfügen von diesem Beispielcode benötigt wird, von 11,7 Sekunden auf 0,22 Sekunden.

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
      
  • Mustererkennung (case/in) ist nicht mehr experimentell.
  • Das $SAFE Feature wurde vollständig entfernt; es ist jetzt eine normale globale Variable.
  • Die Reihenfolge des Backtrace war bei Ruby 2.5 umgekehrt und wurde wiederhergestellt. Jetzt verhält es sich wie bei Ruby 2.4; eine Fehlermeldung und die Zeilennummer, an der die Ausnahme auftritt, werden zuerst ausgegeben, und dann werden die Aufrufer aufgelistet.
  • Einige Standardbibliotheken wurden aktualisiert.
    • RubyGems 3.2.2
    • Bundler 2.2.2
    • IRB 1.2.6
    • Reline 0.1.5
    • Psych 3.2.1
    • JSON 2.4.1
    • BigDecimal 3.0.0
    • CSV 3.1.9
    • Digest 3.0.0
    • Fiddle 1.0.4
    • StringIO 3.0.0
    • StringScanner 3.0.0
  • 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.
    • English
    • abbrev
    • base64
    • drb
    • debug
    • erb
    • find
    • net-ftp
    • net-http
    • net-imap
    • net-protocol
    • open-uri
    • optparse
    • pp
    • prettyprint
    • resolv-replace
    • resolv
    • rinda
    • set
    • securerandom
    • shellwords
    • tempfile
    • tmpdir
    • time
    • tsort
    • un
    • weakref
    • digest
    • io-nonblock
    • io-wait
    • nkf
    • pathname
    • syslog
    • win32ole

Weitere Einzelheiten finden Sie in NEWS oder den Commit-Protokollen.

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

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

Herunterladen

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

    SIZE: 19488885
    SHA1: 34ede2128a90ef3217d9cab9efcdf20fc444f67c
    SHA256: e1270f38b969ce7b124f0a4c217e33eda643f75c7cb20debc62c17535406e37f
    SHA512: 798926db82d27366b39be97556ac5cb322986b96df913c398449bd3ece533e484a3047fe35e7a6241dfbd0f7da803438f5b04b805b33f95c73e3e41d0bb51183
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-rc1.tar.xz

    SIZE: 14341128
    SHA1: deff34cf67373dca166e9961051b6c4723aaaec6
    SHA256: f1adda082f9291e394d25ed32975abbef90962dc4c8b11130586a0151558e79a
    SHA512: f4f13dbfa1c96088eb3dbfba0cb1fe99f4e17197ee2d4b78fbe16496780797a10daa3f2ff9c38d2d7b316974101eccf45184708ad05491fb49898b3a7cc6d673
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-rc1.zip

    SIZE: 23902334
    SHA1: e3e20b4d0ec895e579ae416f2b7552c6be3596f7
    SHA256: 25ced95fa544af6a64d348dc5eace008edfda22f55ed1f6ad9f932b344e6196d
    SHA512: c81b3bf7ce582bf39fd7bc1e691d0777ed4cf38ca6b4d54bc9edaef076ae8bcecb6a86ebfd773591f7d8533e772517033c762d35fdc8b05cb4db4488c2bacec2
    

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