Proč např Object inheritsFrom: fooobaar vrátí true v Smalltalk?

hlasů
1

Zdá se, že inheritsFrom: metoda GNU Smalltalk vrátí hodnotu true pro každý nedefinovaný název třídy zaslána jako parametr. To by mohlo vytvořit program velmi těžké ladit, IMHO. Podíváme-li se na kód pro to ve třídě chování, to vypadá takto:

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
]

Linka aClass isNil iftrue: [^ pravda] je viník, ale jsem hledal rozumný důvod, jak to bylo kódované tímto způsobem. (Jsem nový svět Smalltalk, mimochodem, a snaží se učit.)

Dík.

Položena 09/03/2009 v 11:13
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
3

To se netýká výjimek, ale spíše nedefinovaných proměnných. V GNU Smalltalk je REPL, nebo alternativně v transkriptu nebo pracovní plochy grafických prostředí, nedefinované proměnné jsou nulová --- to není velmi odlišné v Ruby, například.

Takže děláte ve skutečnosti „inheritsFrom objektu: nil“, což je pravda. Nevěděl jsem, že to je nepravdivé v Squeak; že by došlo k odchylce od Modré knihy, ve skutečnosti.

Ve způsobu, by jste dostali za „proměnná fooobaar nedefinované“ kompilace-time chyby.

Odpovězeno 12/03/2009 v 17:35
zdroj uživatelem

hlasů
2

Myslím, že myšlení je, že všechny odkazy třídy musí znamenat třídu nějakého druhu, takže nula reference naznačuje objekt, který je nadřazenou všeho.

Squeak to dělá více jak byste očekávali:

inheritsFrom: aClass 

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

textový odkaz

Odpovězeno 09/03/2009 v 11:26
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more