Einer der häufigsten Fehler in Smalltalk ist die explizite Ergebnis-Token ^
in einem Verfahren zu vergessen.
Basierend auf dieser Frage wäre dies die plausibelste Erklärung, also lassen Sie mich näher darauf eingehen.
Angenommen, Sie haben eine Klasse R
, die eine Instanzvariable dictionary
definiert, die eine Instanz von Dictionary
enthält. Der Getter eines solchen Ivar würde einfach wie folgt aussehen:
myDictionary
^dictionary
Wenn wir jedoch die Rückkehr Token vergessen haben, unseren Code
myDictionary
dictionary
ohne explizite Rückkehr lesen würde. Daher würde der Absender dieser Nachricht stattdessen die implizite Rückgabe erhalten, die self
ist (was den Empfänger myDictionary
bedeutet). Mit anderen Worten, wäre dies gleichbedeutend mit
myDictionary
dictionary.
^self "<- no need to make this explicit here"
und der Sender würde die Instanz von R
anstatt seine dictionary
Ivar bekommen. Somit ist der Ausdruck
r myDictionary size
würde #size
das Ergebnis der r myDictionary
entsenden, die nach unseren Fehlern sind nichts anderes als r
. Mit anderen Worten, es wäre zu
r size
Und da in Smalltalk entsprechen jeder Object
-#size
reagiert, wäre dies keine MessageNotUnderstood
Ausnahme ausgelöst und der Fehler würde unbemerkt bleiben.
Jetzt, warum r size
ist 0
? Da nicht-Array-Objekte standardmäßig auf #size
mit 0 antworten, weisen sie darauf hin, dass sie 0
indexierte Steckplätze haben. Sie können dieses Standardverhalten ändern und #size
mit etwas anderem überschreiben, aber wenn Sie dies nicht tun, wird das passieren.
Was bekommen Sie, wenn Sie 'r myDictionary' auswerten? Wenn 'myDictionary' der Getter eines Wörterbuchs ist, das in einer Instanz var von' r' enthalten ist, überprüfen Sie, ob Sie den Rückgabeoperator '^' vergessen haben; Andernfalls antwortet 'myDictionary' mit' r' und höchstwahrscheinlich mit 'r size = 0'. –