NEWS für Ruby 2.7.0

Dieses Dokument ist eine Liste der für Benutzer sichtbaren Funktionsänderungen zwischen den Versionen, mit Ausnahme von Fehlerbehebungen.

Beachten Sie, dass jeder Eintrag so kurz gehalten wird, dass keine Begründung oder Referenzinformationen angegeben werden. Für eine vollständige Liste der Änderungen mit allen ausreichenden Informationen siehe die Datei ChangeLog oder Redmine (z. B. https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER).

Änderungen seit der Veröffentlichung 2.6.0

Sprachänderungen

Pattern Matching

Die Spezifikation von Schlüsselwortargumenten wird für 3.0 geändert

Nummerierte Parameter

proc/lambda ohne Block ist veraltet

Andere geringfügige Änderungen

Kommandozeilenoptionen

Warning Option

Die Option -W wurde um ein folgendes : erweitert, um kategorisierte Warnungen zu verwalten. [Feature #16345] [Feature #16420]

Siehe auch Warning in Aktualisierungen der Kernklassen.

Aktualisierungen von Core-Klassen (nur die wichtigsten)

Array
Neue Methoden
Comparable
Geänderte Methode
  • Comparable#clamp akzeptiert nun ein Range-Argument. [Feature #14784]

    -1.clamp(0..2) #=> 0
     1.clamp(0..2) #=> 1
     3.clamp(0..2) #=> 2
    # With beginless and endless ranges:
    -1.clamp(0..)  #=> 0
     3.clamp(..2)  #=> 2
    
Complex
Neue Methode
Dir
Geänderte Methoden
  • Dir.glob und Dir.[] erlauben keine NUL-getrennten Glob-Muster mehr. Verwenden Sie stattdessen Array. [Feature #14643]

Encoding
Neue Kodierung
  • Neue Kodierung CESU-8 hinzugefügt. [Feature #15931]

Enumerable
Neue Methoden
  • Hinzugefügt: Enumerable#filter_map. [Feature #15323]

    [1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
    
  • Hinzugefügt: Enumerable#tally. [Feature #11076]

    ["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
    
Enumerator
Neue Methoden
  • Hinzugefügt: Enumerator.produce, um einen Enumerator aus jeder benutzerdefinierten Datentransformation zu generieren. [Feature #14781]

    require "date"
    dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
    dates.detect(&:tuesday?) #=> next Tuesday
    
  • Hinzugefügt: Enumerator::Lazy#eager, das einen nicht-faulen Enumerator aus einem faulen Enumerator generiert. [Feature #15901]

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class               #=> Enumerator
    p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
    
  • Hinzugefügt: Enumerator::Yielder#to_proc, damit ein Yielder-Objekt direkt als Blockargument an eine andere Methode übergeben werden kann. [Feature #15618]

  • Hinzugefügt: Enumerator::Lazy#with_index, um faul zu sein. Zuvor war Enumerator::Lazy#with_index nicht definiert, sodass es die Standardimplementierung von Enumerator aufgriff, die nicht faul war. [Bug #7877]

    ("a"..).lazy.with_index(1) { |it, index| puts "#{index}:#{it}" }.take(3).force
    # => 1:a
    #    2:b
    #    3:c
    
Fiber
Neue Methode
  • Hinzugefügt: Fiber#raise, das sich wie Fiber#resume verhält, aber eine Ausnahme in der wiederaufgenommenen Fiber auslöst. [Feature #10344]

File
Neue Methode
  • Hinzugefügt: File.absolute_path?, um auf portable Weise zu prüfen, ob ein Pfad absolut ist oder nicht. [Feature #15868]

    File.absolute_path?("/foo")   # => true (on *nix)
    File.absolute_path?("C:/foo") # => true (on Windows)
    File.absolute_path?("foo")    # => false
    
Geänderte Methode
  • File.extname gibt nun einen Punkt-String für Namen zurück, die mit einem Punkt enden, auf Nicht-Windows-Plattformen. [Bug #15267]

    File.extname("foo.") #=> "."
    
FrozenError
Neue Methode
  • Hinzugefügt: FrozenError#receiver, um das eingefrorene Objekt zurückzugeben, dessen Änderung versucht wurde. Um dieses Objekt beim Auslösen von FrozenError in Ruby-Code zu setzen, akzeptiert FrozenError.new eine Option :receiver. [Feature #15751]

GC
Neue Methode
  • Hinzugefügt: GC.compact-Methode zum Kompaktieren des Heaps. Diese Funktion kompaktiert lebende Objekte im Heap, sodass weniger Seiten verwendet werden können und der Heap CoW-freundlicher (copy-on-write) sein kann. [Feature #15626]

    Details zum Algorithmus und zu den Einschränkungen finden Sie hier: bugs.ruby-lang.org/issues/15626

IO
Neue Methode
  • Hinzugefügt: IO#set_encoding_by_bom, um die BOM zu prüfen und die externe Kodierung festzulegen. [Bug #15210]

Integer
Geänderte Methode
  • Integer#[] unterstützt nun Bereichsoperationen. [Feature #8842]

    0b01001101[2, 4]  #=> 0b0011
    0b01001100[2..5]  #=> 0b0011
    0b01001100[2...6] #=> 0b0011
    #   ^^^^
    
Method
Geänderte Methode
Module
Neue Methoden
  • Hinzugefügt: Module#const_source_location, um den Ort abzurufen, an dem eine Konstante definiert ist. [Feature #10771]

  • Hinzugefügt: Module#ruby2_keywords zum Markieren einer Methode als Übergabe von Schlüsselwortargumenten über einen regulären Argument-Splat, nützlich beim Delegieren aller Argumente an eine andere Methode, um mit älteren Ruby-Versionen abwärtskompatibel zu sein. [Bug #16154]

Geänderte Methoden
NilClass / TrueClass / FalseClass
Geänderte Methoden
ObjectSpace::WeakMap
Geänderte Methode
Proc
Neue Methode
  • Hinzugefügt: Proc#ruby2_keywords zum Markieren des Procs als Übergabe von Schlüsselwortargumenten über einen regulären Argument-Splat, nützlich beim Delegieren aller Argumente an eine andere Methode oder einen anderen Proc, um mit älteren Ruby-Versionen abwärtskompatibel zu sein. [Feature #16404]

Range
Neue Methode
Geänderte Methode
RubyVM
Entfernte Methode
  • RubyVM.resolve_feature_path wurde zu $LOAD_PATH.resolve_feature_path verschoben. [Feature #15903] [Feature #15230]

String
Unicode
  • Unicode-Version und Emoji-Version von 11.0.0 auf 12.0.0 aktualisiert. [Feature #15321]

  • Unicode-Version auf 12.1.0 aktualisiert, Unterstützung für U+32FF SQUARE ERA NAME REIWA hinzugefügt. [Feature #15195]

  • Unicode Emoji-Version auf 12.1 aktualisiert. [Feature #16272]

Symbol
Neue Methoden
Time
Neue Methoden
  • Hinzugefügt: Time#ceil Methode. [Feature #15772]

  • Hinzugefügt: Time#floor Methode. [Feature #15653]

Geänderte Methode
UnboundMethod
Neue Methode
  • Hinzugefügt: UnboundMethod#bind_call Methode. [Feature #15955]

    umethod.bind_call(obj, ...) ist semantisch äquivalent zu umethod.bind(obj).call(...). Dieses Idiom wird in einigen Bibliotheken verwendet, um eine überschriebene Methode aufzurufen. Die hinzugefügte Methode tut dasselbe ohne die Allokation eines Zwischenmethodenobjekts.

    class Foo
      def add_1(x)
        x + 1
      end
    end
    class Bar < Foo
      def add_1(x) # override
        x + 2
      end
    end
    
    obj = Bar.new
    p obj.add_1(1) #=> 3
    p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2
    p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
    
Warning
Neue Methoden
  • Hinzugefügt: Warning.[] und Warning.[]= zur Verwaltung der Ausgabe/Unterdrückung bestimmter Warnungskategorien. [Feature #16345] [Feature #16420]

$LOAD_PATH
Neue Methode
  • Hinzugefügt: $LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]

Aktualisierungen von Stdlib (nur die wichtigsten)

Bundler
CGI
CSV
Date
Delegator
ERB
  • Das Marshaling von ERB-Instanzen ist verboten.

IRB
  • Einführung von Syntax-Highlighting, inspiriert vom Pry-Gem, für Quellzeilen von Binding#irb, REPL-Eingaben und Inspektionsausgaben einiger Kernobjektklassen.

  • Einführung des Mehrzeilenbearbeitungsmodus durch Reline.

  • Anzeige von Dokumentation bei Vervollständigung.

  • Automatische Einrückung und Speichern/Laden des Verlaufs sind standardmäßig aktiviert.

JSON
  • Upgrade auf 2.3.0.

Net::FTP
  • Hinzugefügt: Net::FTP#features zur Überprüfung verfügbarer Features und Net::FTP#option zum Aktivieren/Deaktivieren jedes einzelnen. [Feature #15964]

Net::HTTP
  • Hinzugefügt: optionaler Parameter ipaddr zu Net::HTTP#start zum Ersetzen der Adresse für die TCP/IP-Verbindung. [Feature #5180]

Net::IMAP
  • Server Name Indication (SNI) Unterstützung hinzugefügt. [Feature #15594]

open-uri
  • Die "open"-Methode von open-uri in Kernel wird mit einer Warnung belegt. Verwenden Sie stattdessen URI.open. [Misc #15893]

  • Die Standardzeichenkodierung des Medientyps „text/*“ ist UTF-8 anstelle von ISO-8859-1. [Bug #15933]

OptionParser
  • Es werden nun „Meinten Sie?“ für unbekannte Optionen angezeigt. [Feature #16256]

    test.rb

    require "optparse"
    OptionParser.new do |opts|
      opts.on("-f", "--foo", "foo") {|v| }
      opts.on("-b", "--bar", "bar") {|v| }
      opts.on("-c", "--baz", "baz") {|v| }
    end.parse!
    

    Beispiel

    $ ruby test.rb --baa
    Traceback (most recent call last):
    test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption)
    Did you mean?  baz
                   bar
Pathname
  • Pathname.glob delegiert nun 3 Argumente an Dir.glob, um den Schlüsselwortparameter base zu akzeptieren. [Feature #14405]

Racc
  • Zusammenführung von 1.4.15 aus dem Upstream-Repository und Hinzufügung der Kommandozeilenschnittstelle von racc.

Reline
  • Neues stdlib, das mit dem readline-stdlib kompatibel ist, aber in reinem Ruby implementiert ist. Es bietet auch einen Mehrzeilenbearbeitungsmodus.

REXML
RSS
RubyGems
StringScanner

Kompatibilitätsprobleme (ausgenommen Feature-Fehlerbehebungen)

Proc
  • Das Format von Proc#to_s wurde geändert. [Feature #16101]

Range
  • Range#minmax iterierte früher über den Bereich, um das Maximum zu bestimmen. Nun verwendet es denselben Algorithmus wie Range#max. In seltenen Fällen (z. B. Bereiche von Floats oder Strings) kann dies zu unterschiedlichen Ergebnissen führen. [Bug #15807]

Kompatibilitätsprobleme mit Stdlib (ausgenommen Fehlerbehebungen von Features)

Pfadname
  • Kernel#Pathname gibt nun, wenn es mit einem Pathname-Argument aufgerufen wird, das Argument zurück, anstatt einen neuen Pathname zu erstellen. Dies ähnelt anderen Kernel-Methoden, kann aber Code brechen, der den Rückgabewert modifiziert und erwartet, dass das Argument nicht modifiziert wird.

profile.rb, Profiler__
  • Aus der Standardbibliothek entfernt. Es war seit Ruby 2.0.0 nicht mehr gepflegt.

Updates der C-API

Implementierungsverbesserungen

Fiber
  • Auswahl verschiedener Coroutine-Implementierungen durch Verwendung von --with-coroutine=, z. B.

    $ ./configure --with-coroutine=ucontext
    $ ./configure --with-coroutine=copy
  • Ersetzt den vorherigen Stack-Cache durch einen Fiber-Pool-Cache. Der Fiber-Pool weist viele Stacks in einem einzigen Speicherbereich zu. Die Stack-Allokation wird O(log N) und die Fiber-Erstellung amortisiert O(1). In Mikro-Benchmarks wurde eine Leistungssteigerung von etwa dem 10-fachen gemessen. github.com/ruby/ruby/pull/2224

File
  • File.realpath verwendet nun auf vielen Plattformen realpath(3), was die Leistung erheblich verbessern kann. [Feature #15797]

Hash
  • Datenstruktur von kleinen Hash-Objekten geändert. [Feature #15602]

Monitor
  • Die Klasse Monitor ist in C-Erweiterung geschrieben. [Feature #16255]

Thread
  • Die VM-Stack-Speicherallokation wird nun mit dem nativen Thread-Stack kombiniert, was die Thread-Allokationsleistung verbessert und Allokationsfehler reduziert. In Mikro-Benchmarks wurde eine Leistungssteigerung von etwa dem 10-fachen gemessen.

JIT
  • JIT-kompilierter Code wird zu weniger optimiertem Code neu kompiliert, wenn eine Optimierungsannahme ungültig wird.

  • Methoden-Inlining wird durchgeführt, wenn eine Methode als rein betrachtet wird. Diese Optimierung ist noch experimentell und viele Methoden werden noch NICHT als rein betrachtet.

  • Der Standardwert von --jit-max-cache wird von 1.000 auf 100 geändert.

  • Der Standardwert von --jit-min-calls wird von 5 auf 10.000 geändert.

RubyVM
  • Der pro Aufruf tätige Methoden-Cache, der seit etwa 1.9 vorhanden ist, wurde verbessert: Die Cache-Trefferrate stieg von 89 % auf 94 %. Siehe github.com/ruby/ruby/pull/2583

RubyVM::InstructionSequence

Sonstige Änderungen