Pourquoi ne puis-je pas créer une nouvelle sous-classe et l'utiliser dans la même phrase?

StackOverflow https://stackoverflow.com/questions/637956

  •  10-07-2019
  •  | 
  •  

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?

Était-ce utile?

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 , alors Foo 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 à la Sous-classe d'objet: #Foo #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ère Sous-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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top