7
votes

Sous-classement Fixnum à Ruby

Donc, je comprends que vous n'êtes pas censé être censé sousclure directement fixnum, flotter ou entier, car ils n'ont pas de méthode #New. L'utilisation de délégueclass semble fonctionner cependant, mais est-ce le meilleur moyen? Quelqu'un sache quelle est la raison derrière ces cours n'ayant pas #New est?

J'ai besoin d'une classe qui se comporte comme un correctif, mais a des méthodes supplémentaires, et j'aimerais pouvoir faire référence à sa valeur via auto à partir de la classe, par exemple: xxx


1 commentaires

Dites-nous ce que vous essayez vraiment de faire (l'objectif final), et nous essaierons de vous dire la meilleure façon de le faire. Je ne pense pas que la sous-classement est appropriée ici.


3 Réponses :


2
votes

Pourriez-vous ne pas prolonger Fixnum lui-même? Comme ... xxx


2 commentaires

Je pourrais, mais je préférerais pas. De plus, FixNum n'a pas de #Neuf, et je dois pouvoir ajouter des fonctionnalités à #Initialiser.


Le patch de singe doit être utilisé avec précaution. Polluer une classe de noyau Ruby juste pour un cas d'utilisation spécifique, peut être dangereux.



4
votes

IIRC, la principale mise en œuvre des stocks de rubis fixe comme des valeurs immédiates, en utilisant certains des bits faibles du mot pour l'étiqueter comme un fixnum au lieu d'un pointeur sur un objet sur le tas. C'est pourquoi, sur une machine de 32 bits, les fixnums ne sont que 29 bits (ou quoi que ce soit) au lieu d'un mot complet.

Donc, à cause de cela, vous ne pouvez pas ajouter de méthodes à une seule "instance" de fixnum, et vous ne pouvez pas le sous-classer.

Si vous êtes décédé de manière morte d'avoir une classe «Fixnum-like», vous devrez probablement créer une classe qui a une variable d'instance Fixnum, et une méthode avant appelle de manière appropriée.


4 commentaires

Ah, je vois. Y a-t-il une autre classe que je pourrais sous-classe? Numérique a une information #New, mais cela ne prend pas d'arguments, alors je suppose que c'est une classe abstraite.


Hmm. Je n'ai pas touché Ruby depuis un moment et je ne me souviens pas exactement comment l'arbre de classe numérique est disposé.


Le seul candidat évident est BigDecimal.


Une solution de contournement pour ajouter des méthodes d'instance à une seule instance de fixnum: classe fixnum; def amusement; to_s.to_sym ==: '37 '? 'Fun': Super; finir; finir



17
votes

Vous pouvez facilement configurer facilement une mise en œuvre rapide de transfert: xxx

alors vous pouvez ajouter les méthodes que vous souhaitez sur myNum, mais vous devez utiliser sur @number dans ces méthodes. , plutôt que de pouvoir appeler super directement.


3 commentaires

Hmm. Mais si vous l'avez fait mynum.new (2) + mynum.new (3), ne recevriez-vous pas un correctif au lieu d'une instance mynum? Je pense que vous devez envelopper @ numéro.Send dans mynum.new


J'ai mis à jour ma réponse pour vous assurer de retourner un mynum si la réponse initiale était numérique.


Mynum peut-il être mis en œuvre de telle sorte que mynum.new (5) == 5 et 5 == mynum.new (5)?