Ganzzahlen, die in Ruby 2.4 zu Ganzzahlen zusammengefasst sind

Ab Ruby 2.4 wird die Klasse der Ganzzahlen geändert, aber Sie müssen besonders vorsichtig sein, wenn Sie C-Erweiterungen schreiben.

Welt bis Ruby 2.3

Natürlich gibt es auch in der Ruby-Welt ganze Zahlen, aber bis jetzt (von der Ruby-Seite) unter der abstrakten Klasse "Integer", "Fixnum" für ganze Zahlen mit kleinen absoluten Werten und "Bignum" für diejenigen, die nicht dazu passen. Es wurde in eine konkrete Klasse namens `unterteilt. In diesem Zusammenhang denke ich, dass der Artikel, den ich zuvor geschrieben habe hilfreich sein wird.

Problem

Es gab einige Probleme mit dieser Form.

Änderungen in Ruby 2.4

Aus diesem Grund werden ab Ruby 2.4 beide in "Integer" integriert.

Von der Rubinseite aus gesehen

Normalerweise gab es beim Schreiben eines Programms nur wenige Situationen, in denen Sie "Fixnum" oder "Bignum" direkt verwendeten, und ich denke nicht, dass dies ein großes Problem wäre, aber es gibt einige Punkte zu beachten. ..

Aus Gründen der Kompatibilität mit vorhandenen Programmen bleiben die Konstanten "Fixnum" und "Bignum" weiterhin bestehen, beide sind jedoch ** "Integer" -Aliasnamen **. Selbst wenn jede von ihnen eine offene Klasse ist, ist es so, als würde man "Integer" direkt ändern (es ist besser, sie so zu ändern, dass sie richtig korrespondiert).

Und wenn Sie überprüfen, ob es in Fixnum wie foo.is_a? (Fixnum) passt, wird es in Ruby 2.4 alsfoo.is_a? (Integer)betrachtet, und wenn es eine Ganzzahl ist, ist es immer wahr. Ich werde. Die Absicht, nach "Fixnum" zu suchen (abgesehen von Situationen mit C-Erweiterungen), ist grundsätzlich ein Problem. Lassen Sie uns das Problem beheben, um den Bereich ordnungsgemäß zu überprüfen.

Dies kann sich in einigen Fällen auch tatsächlich auswirken. Wenn Sie jedoch die Konstanten "Fixnum" und "Bignum" als Teil der DSL verwenden, haben sie denselben Wert wie "Integer", sodass dies gut funktioniert. Es wird nicht funktionieren. Befolgen Sie die Anweisungen für den verwendeten Edelstein und ersetzen Sie ihn entsprechend.

Von der Seite der C-Sprache aus gesehen

Die Unterscheidung zwischen "Fixnum" und "Bignum" wurde bei Ruby aufgehoben, aber in der Welt der C-Sprache bleiben die beiden Arten interner Strukturen unverändert. Dies bedeutet also nicht, dass Sie alle Teile, die Ganzzahlen verarbeiten, neu schreiben müssen.

In der C-Sprache sind jedoch "rb_cFixnum" und "rb_cBignum", die "Fixnum" und "Bignum" darstellen, ** veraltet **. Wenn Sie diese Konstanten verwenden, wird ein Kompilierungsfehler angezeigt. Als Alternative

Außerdem ist RUBY_INTEGER_UNIFICATION als Konstante definiert, um diese Verteilungen zu unterstützen. Lassen Sie uns mit #ifdef RUBY_INTEGER_UNIFICATION trennen.

Überprüfen Sie Ihren eigenen Edelstein

Überprüfen Sie den Code für die zuvor erstellten jkr2255 / bit_utils (Erläuterung) Ich habe es versucht, aber intern gibt es Methoden für "Fixnum" und "Bignum".

Es war so. Und außer beim Öffnen und Verwenden von "Fixnum" habe ich es so verwendet, wie es für "Bignum" ist, und selbst in der offenen Klasse habe ich in der Reihenfolge "Fixnum" → "Bignum" gearbeitet, damit alles so funktioniert, wie es ist. Es war ein Fluss wie gehen. Es funktionierte gut mit Ruby 2.4.0-Preview2.

Das Öffnen von "Fixnum" und "Bignum" ist jedoch schlecht, daher plane ich, es neu zu schreiben.

Referenzmaterial

PDF der bei RubyKaigi präsentierten Folien

[^ 1]: Sehr schnell, weil es nur ein Bit betrachtet.

Recommended Posts

Ganzzahlen, die in Ruby 2.4 zu Ganzzahlen zusammengefasst sind
Schwer in Rubin! ??
Ausgabedreieck in Ruby
Arten von Variablen in Ruby
Schneller Popcount in Ruby
ABC177 - E in Ruby lösen
Überprüfen Sie JWT-Token in Ruby
Integer # pow wird empfohlen, um die Quadratmethode in Ruby wiederholt zu lösen
Schreiben Sie die Klassenvererbung in Ruby
Aktualisieren Sie Ruby in der Unicorn-Umgebung
Wie man ganze Zahlen mit Rubin überprüft
[Ruby] Ausnahmebehandlung in Funktionen
Verwenden Sie Ruby-Variablen in Javascript.
Multiplikation innerhalb eines Ruby-Arrays
Über reguläre Ausdrücke in Ruby
Mikro-Benchmark für Gleitkommazahlen zur Potenz von ganzen Zahlen in Ruby
NCk mod p in Ruby
Wie man in Ruby auf unbestimmte Zeit iteriert
Versuchen Sie, Yuma in Ruby zu implementieren
Erzielen Sie eine dreistellig begrenzte Anzeige in Ruby
Ruby on Rails Japanisch-Englisch kompatibler i18n
So installieren Sie Bootstrap in Ruby
Implementieren Sie den gRPC-Client in Ruby
Schreiben Sie Schlüssel und Werte in Ruby
[Super Einführung] Über Symbole in Ruby
Hanachan in Ruby (zerstörungsfreie Array-Manipulation)
OpenSL-Versionsinformationen in Ruby OPENSSL_VERSION
Ruby-Methoden, die häufig in Rails verwendet werden
Segfo Ruby in 2 Zeilen