Entiers qui sont unifiés en entiers dans Ruby 2.4

À partir de Ruby 2.4, la classe des entiers sera modifiée, mais vous devez faire attention surtout lors de l'écriture d'extensions C.

Monde jusqu'à Ruby 2.3

Bien sûr, il y a aussi des entiers dans le monde Ruby, mais jusqu'à présent (du côté Ruby), sous la classe abstraite ʻInteger, Fixnum pour les entiers avec de petites valeurs absolues, et Bignumpour ceux qui ne rentrent pas dedans. Il a été divisé en une classe concrète appelée. À ce propos, je pense que l'article que j'ai écrit avant sera utile.

problème

Il y avait quelques problèmes avec cette forme.

Changements dans Ruby 2.4

Pour cette raison, à partir de Ruby 2.4, les deux seront intégrés dans ʻInteger`.

Vu du côté Ruby

Normalement, lors de l'écriture d'un programme, il y avait peu de situations où vous utilisiez Fixnum ou Bignum directement en premier lieu, et je ne pense pas que ce serait un gros problème, mais il y a quelques points à noter. ..

Pour la compatibilité avec les programmes existants, les constantes «Fixnum» et «Bignum» continueront d'exister, mais les deux seront des alias ** ʻInteger **. Même si chacune est une classe ouverte, ce sera comme changer directement ʻInteger (il vaut mieux le modifier pour qu'il corresponde correctement).

Et si vous vérifiez s'il rentre dans Fixnum comme foo.is_a? (Fixnum), il sera considéré commefoo.is_a? (Integer) ʻ dans Ruby 2.4, et si c'est un entier, ce sera toujours vrai. Je vais. L'intention de vérifierFixnum` (en dehors des situations impliquant des extensions C) est fondamentalement un problème, donc corrigeons-le pour vérifier correctement la plage.

Cela peut également affecter dans certains cas, mais si vous utilisez les constantes Fixnum et Bignum dans le cadre de la DSL, elles auront la même valeur que ʻInteger`, donc cela fonctionne bien. Ça ne marchera pas. Suivez les instructions de la gemme que vous utilisez et remplacez-la de manière appropriée.

Vu du côté du langage C

La distinction entre «Fixnum» et «Bignum» a été abolie sur Ruby, mais dans le monde du langage C, les deux types de structures internes existent toujours. Donc, cela ne signifie pas que vous devez réécrire toutes les parties qui gèrent des entiers.

Cependant, en langage C, rb_cFixnum et rb_cBignum, qui représentent Fixnum et Bignum, sont ** obsolètes **. Si vous utilisez ces constantes, vous obtiendrez une erreur de compilation. Comme alternative

De plus, RUBY_INTEGER_UNIFICATION est défini comme une constante pour prendre en charge ces distributions. Séparons avec #ifdef RUBY_INTEGER_UNIFICATION.

Vérifiez votre propre bijou

Vérifiez le code pour le [jkr2255 / bit_utils] précédemment créé (https://github.com/jkr2255/bit_utils) (Explication) J'ai essayé, mais en interne, il existe des méthodes pour Fixnum et Bignum,

C'était comme ça. Et, sauf lors de l'ouverture et de l'utilisation de Fixnum, je l'ai utilisé tel quel pour Bignum, et même dans la classe ouverte, je suis allé dans l'ordre de FixnumBignum, donc tout fonctionne bien tel quel. C'était un flux comme aller. Cela fonctionnait bien avec Ruby 2.4.0-preview2.

Cependant, ouvrir à la fois Fixnum et Bignum est une mauvaise manière, donc je prévois de le réécrire.

Matériel de référence

PDF des diapositives présentées à RubyKaigi

[^ 1]: Très rapide car il ne regarde qu'un bit.

Recommended Posts

Entiers qui sont unifiés en entiers dans Ruby 2.4
Lourd en rubis! ??
Triangle de sortie en Ruby
Types de variables dans ruby
Popcount rapide en Ruby
ABC177-Résoudre E avec Ruby
Valider les jetons JWT dans Ruby
Integer # pow est recommandé pour résoudre à plusieurs reprises la méthode du carré dans Ruby
Écrire l'héritage de classe dans Ruby
Mettre à jour Ruby dans l'environnement Unicorn
Comment vérifier les nombres entiers avec ruby
[Ruby] Gestion des exceptions dans les fonctions
Utilisez des variables ruby en javascript.
Multiplication dans un tableau Ruby
À propos des expressions régulières dans Ruby
Micro-benchmark pour les nombres à virgule flottante à la puissance des entiers dans Ruby
NCk mod p dans Ruby
Comment itérer indéfiniment en Ruby
Essayez d'implémenter Yuma dans Ruby
Obtenez un affichage délimité à 3 chiffres en Ruby
Ruby on Rails compatible japonais-anglais i18n
Comment installer Bootstrap dans Ruby
Implémenter le client gRPC dans Ruby
Ecrire des clés et des valeurs dans Ruby
[Super Introduction] À propos des symboles dans Ruby
Hanachan en Ruby (manipulation non destructive de tableaux)
Informations sur la version openssl dans ruby OPENSSL_VERSION
Méthodes Ruby souvent utilisées dans Rails
Segfo Ruby en 2 lignes