Question

Il semble que la méthode inheritsFrom: de GNU Smalltalk retourne la valeur true pour chaque nom de classe non défini qui lui est envoyé en tant que paramètre. Cela pourrait rendre un programme très difficile à déboguer, à mon humble avis. En regardant le code correspondant à cela dans la classe Behavior, cela ressemble à ceci:

inheritsFrom: aClass [
"Returns true if aClass is a superclass of the receiver"

<category: 'testing the class hierarchy'>
| sc |
aClass isNil ifTrue: [^true].

sc := self.
[sc := sc superclass.
sc isNil] whileFalse: [sc == aClass ifTrue: [^true]].
^false
]

La ligne aClass isNil ifTrue: [^ true] est le coupable, mais je cherche une raison valable de coder ainsi. (Je suis nouveau dans le monde Smalltalk, d'ailleurs, et j'essaie d'apprendre.)

Merci.

Était-ce utile?

La solution

Cela n’est pas lié à des exceptions, mais plutôt à des variables non définies. Dans la réplique de GNU Smalltalk, ou alternativement dans un espace de transcription ou de travail pour les environnements graphiques, les variables indéfinies sont toutes nuls - ceci n’est pas très différent dans Ruby, par exemple.

Vous êtes donc en train de faire "Objet inheritsFrom: nil", ce qui est vrai. Je ne savais pas que c'était faux dans Squeak; ce serait un départ du Livre bleu, en fait.

Dans une méthode, vous auriez obtenu une "variable fooobaar undefined". erreur de compilation.

Autres conseils

Je suppose que la pensée est que toutes les références de classe doivent impliquer une classe de sorte que la référence nil implique Object, qui est la super-classe de tout.

Squeak le fait plus que prévu.

inheritsFrom: aClass 

|aSuperclass |
aSuperclass := superclass.
[aSuperclass == nil]
    whileFalse: [aSuperclass == aClass
            ifTrue: [^ true].
        aSuperclass := aSuperclass superclass].
^ false

texte du lien

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