2017-11-27 3 views
0

Gibt es einen speziellen Weg, wie Wörterbuchgröße zu bekommen?Größe des Wörterbuchs ist 0

Ich füge zwei Elemente hinzu. Drucken mit STON-Returns:

was korrekt ist. Jedoch mit

r myDIctionary size 

kehrt immer 0. Gibt es eine Abhilfe oder wie es zu tun?

+2

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'. –

Antwort

2

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.

Verwandte Themen