Ab Ruby 2.4 wird die Klasse der Ganzzahlen geändert, aber Sie müssen besonders vorsichtig sein, wenn Sie C-Erweiterungen schreiben.
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.
Es gab einige Probleme mit dieser Form.
Fixnum
und Bignum
sind unterschiedliche Implementierungsdetails, sodass der Unterschied von der Ruby-Seite nicht erkennbar ist.Fixnum
und Bignum
unterschiedlich ist, obwohl sie dieselbe ganze Zahl sind **Aus diesem Grund werden ab Ruby 2.4 beide in "Integer" integriert.
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.
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
FIXNUM_P
[^ 1] oder RB_TYPE_P
ersetzen. Das T_BIGNUM
zur Anzeige der internen Datenstruktur ist lebendig und gut.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 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".
Fixnum
… Das Werfen von Bignum
führt zu einem FehlerBignum
... Es funktioniert mit Fixnum
, aber ein wenig zusätzliche Verarbeitung ist enthaltenEs 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.
PDF der bei RubyKaigi präsentierten Folien
[^ 1]: Sehr schnell, weil es nur ein Bit betrachtet.
Recommended Posts