Pourquoi ne puis-je pas créer une nouvelle sous-classe et l'utiliser dans la même phrase?
Question
Je me demande pourquoi les opérations suivantes ne fonctionnent pas dans GNU Smalltalk:
Object subclass: Foo [ ] new printNl
Je m'attendais à une impression de quelque chose comme "un Foo", mais au lieu de cela gst imprime "nil". Cela ne vous semble-t-il pas un peu étrange?
La solution
Sous-classe d'objet: Foo []
n'est pas une syntaxe Smalltalk «habituelle», c'est un ajout récent conçu pour faciliter le codage dans les fichiers. Auparavant, il n'existait pas de syntaxe dédiée pour déclarer une classe, puisqu'elles seraient créées par une commande dans l'image. Interpréter ce code comme vous le pensiez serait faux pour plusieurs raisons:
-
D'abord, si
sous-classe:
était un vrai message envoyé àObject
, alorsFoo
devrait résoudre quelque chose qui n'est pas possible car il est juste d'être déclaré. Cependant, en coulisse, le compilateur fait quelque chose de similaire à laSous-classe d'objet: #Foo
où#Foo
est un symbole du nom d'une nouvelle classe à créer. Il serait possible d'écrire tout le code de cette manière, sauf que vous ne pourriez pas utiliser directement les noms de classe (car ils n'existent pas encore à la lecture du code). Vous devrez faire(Smalltalk à: #Foo) new printNl
partout. Donc la forme entièreSous-classe d'objet: Foo []
est une syntaxe pure qui déclare simplement que cette classe doit être créée, et ne signifie pas qu'actuellement un message doit être envoyé àObject
, etc -
Deuxièmement, vous ne voulez pas créer de classes au milieu d'un algorithme et leur envoyer des messages immédiatement, ce serait plutôt moche comme pratique de développement. Notez que les classes doivent être enregistrées dans le système pour que le navigateur puisse les afficher, que le compilateur puisse recompiler automatiquement les dépendances, que le contrôle de version puisse les enregistrer, etc. De plus, que se passe-t-il si votre code l'exécute accidentellement deux fois? Devriez-vous avoir un Foo de deuxième classe et oublier le précédent? Ainsi, généralement, seuls le compilateur, le navigateur et les autres outils de méta-programmation créent de nouvelles classes, et uniquement à la demande du programmeur.
Autres conseils
Ceci est interprété comme deux déclarations. Le premier est
Sous-classe d'objet: Foo []
et le second est
nouvelle impression
où la nouvelle variable est indéfinie, donc nil.