À 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.
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.
Il y avait quelques problèmes avec cette forme.
Fixnum
et Bignum
sont des détails d'implémentation différents, il n'est donc pas nécessaire de voir la différence du côté Ruby.Fixnum
et Bignum
même s'il s'agit du même entier **Fixnum
diffère selon l'environnement (mauvaise portabilité)Pour cette raison, à partir de Ruby 2.4, les deux seront intégrés dans ʻInteger`.
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érifier
Fixnum` (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.
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
FIXNUM_P
[^ 1] ou RB_TYPE_P
. Le T_BIGNUM
pour indiquer que la structure de données interne est bien vivante. (
rb_cInteger). S'il y a des fonctions séparées pour
Fixnum et
Bignum`, il sera nécessaire de les trier en interne.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 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
,
Fixnum
… Lancer Bignum
entraînera une erreurBignum
... Cela fonctionne avec Fixnum
, mais un peu de traitement supplémentaire est inclusC'é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 Fixnum
→ Bignum
, 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.
PDF des diapositives présentées à RubyKaigi
[^ 1]: Très rapide car il ne regarde qu'un bit.
Recommended Posts