2009-03-09 1 views
1

Es scheint, dass die Methode inheritesFrom: in GNU Smalltalk true für jeden undefinierten Klassennamen zurückgibt, der als Parameter an sie gesendet wird. Dies macht ein Programm sehr schwer zu debuggen, IMHO. Mit Blick auf den Code für diese in der Behavior Klasse, sieht es wie folgt aus:Warum tut z.B. Object inheritsFrom: fooobar gibt in Smalltalk true zurück?

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 
] 

Die Linie aClass isNil ifTrue: [^ true] ist der Schuldige, aber ich bin auf der Suche nach einem vernünftigen Grund an, wie es war so codiert. (Ich bin übrigens neu in der Smalltalk-Welt und versuche zu lernen.)

Danke.

Antwort

3

Dies ist nicht auf Ausnahmen im Zusammenhang, sondern auf nicht definierte Variablen. In GNU Smalltalks REPL, oder alternativ in einem Transcript oder Workspace für grafische Umgebungen, sind undefinierte Variablen alle null - das ist beispielsweise in Ruby nicht sehr unterschiedlich.

Sie tun tatsächlich "Object inheritsFrom: nil", was wahr ist. Ich wusste nicht, dass es in Squeak falsch ist; das wäre eigentlich eine Abkehr vom Blaubuch.

In einer Methode hätten Sie einen "Variablen fooobaar undefined" Fehler bei der Kompilierung erhalten.

+0

Hum, Neils Antwort (die ich nicht direkt kommentieren kann) ist falsch in diesem Objekt ist nicht die Oberklasse von allem. In gewissem Sinne ist nil die Oberklasse von allem - die Autoload-Klasse von GNU Smalltalk zum Beispiel erbt direkt von nil, nicht von Object, und es gibt viele andere Beispiele. –

2

Ich denke, das Denken ist, dass alle Klassenreferenzen eine Klasse von irgendeiner Art implizieren müssen, so dass die Null-Referenz Objekt bedeutet, die die Oberklasse von allem ist.

Squeak tut es so, wie man es erwarten würde:

inheritsFrom: aClass 

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

link text

+0

Während Sie recht haben, dass dies näher an meiner Erwartung ist, was ich wirklich erwarten würde war, dass es eine Ausnahme geworfen würde. – Eyvind

+0

Smalltalk verwendet Ausnahmen normalerweise nicht sehr. –

Verwandte Themen