Ruby 3.2.0 Preview 3 veröffentlicht
Gepostet von naruse am 11. Nov 2022
Wir freuen uns, die Veröffentlichung von Ruby 3.2.0-preview3 bekannt zu geben. Ruby 3.2 bringt viele neue Funktionen und Leistungsverbesserungen.
WASI-basierte WebAssembly-Unterstützung
Dies ist ein erster Port der WASI-basierten WebAssembly-Unterstützung. Dies ermöglicht die Verfügbarkeit eines CRuby-Binärprogramms in Webbrowsern, serverlosen Edge-Umgebungen und anderen WebAssembly/WASI-Einbettungen. Derzeit besteht dieser Port die grundlegenden und Bootstrap-Test-Suiten, die die Thread-API nicht verwenden.

Hintergrund
WebAssembly (Wasm) wurde ursprünglich eingeführt, um Programme sicher und schnell in Webbrowsern auszuführen. Sein Ziel – Programme effizient und sicher in verschiedenen Umgebungen auszuführen – ist jedoch seit langem nicht nur für das Web, sondern auch für allgemeine Anwendungen gefragt.
WASI (The WebAssembly System Interface) wurde für solche Anwendungsfälle entwickelt. Obwohl solche Anwendungen mit Betriebssystemen kommunizieren müssen, läuft WebAssembly in einer virtuellen Maschine ohne Systemoberfläche. WASI standardisiert dies.
WebAssembly/WASI-Unterstützung in Ruby beabsichtigt, diese Projekte zu nutzen. Sie ermöglicht es Ruby-Entwicklern, Anwendungen zu schreiben, die auf einer solchen vielversprechenden Plattform laufen.
Anwendungsfall
Diese Unterstützung ermutigt Entwickler, CRuby in der WebAssembly-Umgebung zu nutzen. Ein Anwendungsbeispiel dafür ist die CRuby-Unterstützung des TryRuby-Playgrounds. Jetzt können Sie original CRuby in Ihrem Webbrowser ausprobieren.
Technische Punkte
Das heutige WASI und WebAssembly selbst haben einige fehlende Funktionen zur Implementierung von Fiber, Exception und GC, da sie sich noch weiterentwickeln und auch aus Sicherheitsgründen. Daher schließt CRuby diese Lücke durch die Verwendung von Asyncify, einer binären Transformationstechnik zur Steuerung der Ausführung im Userland.
Darüber hinaus haben wir ein VFS auf Basis von WASI erstellt, damit wir Ruby-Apps einfach in eine einzige .wasm-Datei packen können. Das erleichtert die Verteilung von Ruby-Apps.
Verwandte Links
- Hinzufügen von WASI-basierter WebAssembly-Unterstützung #5407
- Ein Update zur WebAssembly/WASI-Unterstützung in Ruby
Regexp-Verbesserungen gegen ReDoS
Es ist bekannt, dass Regexp-Abgleich unerwartet lange dauern kann. Wenn Ihr Code versucht, einen möglicherweise ineffizienten Regexp gegen eine nicht vertrauenswürdige Eingabe abzugleichen, kann ein Angreifer dies für eine effiziente Denial-of-Service-Attacke (sogenannter Regular Expression DoS oder ReDoS) ausnutzen.
Wir haben zwei Verbesserungen eingeführt, die ReDoS erheblich abmildern.
Verbesserter Regexp-Abgleichalgorithmus
Seit Ruby 3.2 wurde der Abgleichalgorithmus von Regexp durch die Verwendung von Memoization-Techniken erheblich verbessert.
# This matching takes 10 sec. in Ruby 3.1, and does 0.003 sec. in Ruby 3.2
/^a*b?a*$/ =~ "a" * 50000 + "x"
Der verbesserte Abgleichalgorithmus ermöglicht es, die meisten Regexp-Abgleiche (etwa 90 % in unseren Experimenten) in linearer Zeit abzuschließen.
(Für Preview-Benutzer: Diese Optimierung kann für jeden Abgleich Arbeitsspeicher proportional zur Eingabelänge verbrauchen. Wir erwarten keine praktischen Probleme, da diese Speicherzuweisung normalerweise verzögert wird und ein normaler Regexp-Abgleich höchstens das 10-fache der Arbeitsspeichergröße der Eingabelänge verbraucht. Wenn Ihnen bei der Abgleichung von Regexps in einer realen Anwendung der Arbeitsspeicher ausgeht, melden Sie dies bitte.)
Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/19104
Regexp-Timeout
Die obige Optimierung kann nicht auf einige Arten von regulären Ausdrücken angewendet werden, z. B. auf solche, die erweiterte Funktionen (z. B. Rückreferenzen oder Look-around) enthalten, oder mit einer riesigen festen Anzahl von Wiederholungen. Als Fallback-Maßnahme wurde auch ein Timeout-Feature für Regexp-Abgleiche eingeführt.
Regexp.timeout = 1.0
/^a*b?a*()\1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
Beachten Sie, dass Regexp.timeout eine globale Konfiguration ist. Wenn Sie unterschiedliche Timeout-Einstellungen für einige spezielle Regexps verwenden möchten, können Sie das Schlüsselwort timeout für Regexp.new verwenden.
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new('^a*b?a*()\1$', timeout: Float::INFINITY)
long_time_re =~ "a" * 50000 + "x" # never interrupted
Der ursprüngliche Vorschlag ist https://bugs.ruby-lang.org/issues/17837
Weitere bemerkenswerte neue Funktionen
Keine Bündelung von Drittanbieterquellen mehr
-
Wir bündeln keine Drittanbieterquellen mehr wie
libyaml,libffi.-
Die libyaml-Quelltexte wurden aus psych entfernt. Möglicherweise müssen Sie
libyaml-devauf Ubuntu/Debian-Plattformen installieren. Der Paketname ist auf jeder Plattform unterschiedlich. -
Die gebündelten libffi-Quelltexte wurden ebenfalls aus
fiddleentfernt.
-
Sprache
-
Anonyme Rest- und Keyword-Rest-Argumente können nun als Argumente übergeben werden, nicht nur in Methodenparametern verwendet werden. [Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end -
Ein Proc, das ein einzelnes positionsbezogenes Argument und Schlüsselwörter akzeptiert, wird nicht mehr automatisch gesplittet. [Bug #18633]
proc{|a, **k| a}.call([1, 2]) # Ruby 3.1 and before # => 1 # Ruby 3.2 and after # => [1, 2] -
Die Auswertungsreihenfolge der Konstantenbelegung für explizit auf Objekten gesetzte Konstanten wurde mit der Auswertungsreihenfolge der einzelnen Attributbelegung konsistent gemacht. Mit diesem Code
foo::BAR = bazfoowird nun vorbazaufgerufen. Ebenso wird für Mehrfachzuweisungen an Konstanten die Auswertungsreihenfolge von links nach rechts verwendet. Mit diesem Codefoo1::BAR1, foo2::BAR2 = baz1, baz2Die folgende Auswertungsreihenfolge wird nun verwendet
foo1foo2baz1baz2
-
Das Find-Muster ist nicht mehr experimentell. [Feature #18585]
-
Methoden, die einen Restparameter (wie
*args) annehmen und Schlüsselwortargumente überfoo(*args)delegieren möchten, müssen jetzt mitruby2_keywordsgekennzeichnet sein (falls noch nicht geschehen). Mit anderen Worten, alle Methoden, die Schlüsselwortargumente über*argsdelegieren möchten, müssen nun ausnahmslos mitruby2_keywordsgekennzeichnet sein. Dies erleichtert die Umstellung auf andere Delegationsmethoden, sobald eine Bibliothek Ruby 3+ erfordern kann. Zuvor wurde das Flagruby2_keywordsbeibehalten, wenn die empfangende Methode*argsannahm, dies war jedoch ein Fehler und eine Inkonsistenz. Eine gute Technik, um möglicherweise fehlendesruby2_keywordszu finden, ist, die Testsuite auszuführen, bei Fehlern die letzte Methode zu finden, die Schlüsselwortargumente empfangen muss, dortputs nil, caller, nilaufzurufen und jede Methode/jeden Block in der Aufrufkette, der Schlüsselwörter delegieren muss, korrekt alsruby2_keywordsgekennzeichnet zu überprüfen. [Bug #18625] [Bug #16466]def target(**kw) end # Accidentally worked without ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords # needed in 3.2+. Just like (*args, **kwargs) or (...) would be needed on # both #foo and #bar when migrating away from ruby2_keywords. ruby2_keywords def bar(*args) target(*args) end ruby2_keywords def foo(*args) bar(*args) end foo(k: 1)
Leistungsverbesserungen
YJIT
- Unterstützung für arm64 / aarch64 auf UNIX-Plattformen.
- Das Erstellen von YJIT erfordert Rust 1.58.1+. [Feature #18481]
Weitere bemerkenswerte Änderungen seit 3.1
- Hash
- Hash#shift gibt nun immer nil zurück, wenn der Hash leer ist, anstatt den Standardwert zurückzugeben oder die Standardprozedur aufzurufen. [Bug #16908]
- MatchData
- MatchData#byteoffset wurde hinzugefügt. [Feature #13110]
- Module
- Module.used_refinements wurde hinzugefügt. [Feature #14332]
- Module#refinements wurde hinzugefügt. [Feature #12737]
- Module#const_added wurde hinzugefügt. [Feature #17881]
- Proc
- Proc#dup gibt eine Instanz einer Unterklasse zurück. [Bug #17545]
- Proc#parameters akzeptiert nun das Lambda-Schlüsselwort. [Feature #15357]
- Refinement
- Refinement#refined_class wurde hinzugefügt. [Feature #12737]
- RubyVM::AbstractSyntaxTree
- Hinzufügen der Option
error_tolerantfürparse,parse_fileundof. [Feature #19013]
- Hinzufügen der Option
- Set
- Set ist jetzt als integrierte Klasse verfügbar, ohne dass
require "set"erforderlich ist. [Feature #16989] Es wird derzeit über die KonstanteSetoder einen Aufruf vonEnumerable#to_setautomatisch geladen.
- Set ist jetzt als integrierte Klasse verfügbar, ohne dass
- String
- String#byteindex und String#byterindex wurden hinzugefügt. [Feature #13110]
- Unicode auf Version 14.0.0 und Emoji auf Version 14.0 aktualisiert. [Feature #18037] (gilt auch für Regexp)
- String#bytesplice wurde hinzugefügt. [Feature #18598]
- Struct
- Eine Struct-Klasse kann auch mit Schlüsselwortargumenten initialisiert werden, ohne
keyword_init: truebeiStruct.new. [Feature #16806]
- Eine Struct-Klasse kann auch mit Schlüsselwortargumenten initialisiert werden, ohne
Kompatibilitätsprobleme
Hinweis: Ausgenommen sind Feature-Fehlerbehebungen.
Entfernte Konstanten
Die folgenden veralteten Konstanten wurden entfernt.
FixnumundBignum[Feature #12005]Random::DEFAULT[Feature #17351]Struct::GroupStruct::Passwd
Entfernte Methoden
Die folgenden veralteten Methoden wurden entfernt.
Dir.exists?[Feature #17391]File.exists?[Feature #17391]Kernel#=~[Feature #15231]Kernel#taint,Kernel#untaint,Kernel#tainted?[Feature #16131]Kernel#trust,Kernel#untrust,Kernel#untrusted?[Feature #16131]
Stdlib-Kompatibilitätsprobleme
Psychbündelt keine libyaml-Quelltexte mehr. Benutzer müssen die libyaml-Bibliothek selbst über das Paketverwaltungssystem installieren. [Feature #18571]
C-API-Aktualisierungen
Aktualisierte C-APIs
Die folgenden APIs wurden aktualisiert.
- PRNG-Update
rb_random_interface_taktualisiert und versioniert. Erweiterungsbibliotheken, die diese Schnittstelle verwenden und für ältere Versionen erstellt wurden. Auch die Funktioninit_int32muss definiert werden.
Entfernte C-APIs
Die folgenden veralteten APIs wurden entfernt.
- Variable
rb_cData. - „Taintedness“- und „Trustedness“-Funktionen. [Feature #16131]
Aktualisierungen der Standardbibliotheken
-
SyntaxSuggest
- Die Funktion
syntax_suggest, früherdead_end, wurde in Ruby integriert. [Feature #18159]
- Die Funktion
-
ErrorHighlight
- Jetzt werden Argumente von TypeError und ArgumentError hervorgehoben.
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
- Die folgenden Standard-Gems werden aktualisiert.
- RubyGems 3.4.0.dev
- bigdecimal 3.1.2
- bundler 2.4.0.dev
- cgi 0.3.2
- date 3.2.3
- error_highlight 0.4.0
- etc 1.4.0
- io-console 0.5.11
- io-nonblock 0.1.1
- io-wait 0.3.0.pre
- ipaddr 1.2.4
- json 2.6.2
- logger 1.5.1
- net-http 0.2.2
- net-protocol 0.1.3
- ostruct 0.5.5
- psych 5.0.0.dev
- reline 0.3.1
- securerandom 0.2.0
- set 1.0.3
- stringio 3.0.3
- syntax_suggest 0.0.1
- timeout 0.3.0
- Die folgenden gebündelten Gems werden aktualisiert.
- minitest 5.16.3
- net-imap 0.2.3
- rbs 2.6.0
- typeprof 0.21.3
- debug 1.6.2
- Die folgenden Standard-Gems sind nun gebündelte Gems.
Weitere Details finden Sie in NEWS oder den Commit-Logs.
Mit diesen Änderungen wurden seit Ruby 3.1.0 2719 Dateien geändert, 191269 Einfügungen(+), 120315 Löschungen(-)!
Herunterladen
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.gz
SIZE: 20086542 SHA1: dafca8116d36ceaa32482ab38359768de8c3ae5e SHA256: c041d1488e62730d3a10dbe7cf7a3b3e4268dc867ec20ec991e7d16146640487 SHA512: 860634d95e4b9c48f18d38146dfbdc3c389666d45454248a4ccdfc3a5d3cd0c71c73533aabf359558117de9add1472af228d8eaec989c9336b1a3a6f03f1ae88 -
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.tar.xz
SIZE: 14799804 SHA1: c94e2add05502cb5c39afffc995b7c8f000f7df0 SHA256: d3f5619de544240d92a5d03aa289e71bd1103379622c523a0e80ed029a74b3bb SHA512: c1864e2e07c3711eaa17d0f85dfbcc6e0682b077782bb1c155315af45139ae66dc4567c73682d326975b0f472111eb0a70f949811cb54bed0b3a816ed6ac34df -
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview3.zip
SIZE: 24426893 SHA1: 346c051c4be7ab8d0b551fd2ff8169785697db62 SHA256: cf49aa70e7ebd8abebffd5e49cd3bd92e5b9f3782d587cc7ed88c98dd5f17069 SHA512: 4f22b5ea91be17ef5f68cf0acb1e3a226dcc549ad71cc9b40e623220087c4065ca9bea942710f668e5c94ca0323da8d2ccd565f95a9085c1a0e38e9c0543b22f
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