Pergunta

Parece que o inheritsFrom: método no GNU Smalltalk retorna verdadeiro para cada nome de classe indefinido enviou a ele como um parâmetro. Isso pode fazer um programa muito difícil de debug, IMHO. Olhando para o código para este na classe Behavior, ele se parece com isso:

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
]

A linha de aClass isNil ifTrue: [^ verdadeiro] é o culpado, mas eu estou procurando uma razão sã como a forma como foi codificado desta forma. (Eu sou novo para o mundo Smalltalk, a propósito, e tentando aprender.)

Graças.

Foi útil?

Solução

Isto não está relacionado com exceções mas sim variáveis ??indefinidas. Em REPL do GNU Smalltalk, ou, alternativamente, em uma transcrição ou espaço de trabalho para ambientes gráficos, variáveis ??indefinidas são todos nula --- isso não é muito diferente em Ruby, por exemplo.

Assim que você está fazendo na verdade "inheritsFrom Objeto: nil", o que é verdade. Eu não sabia o que é falso em Squeak; que seria uma partida do Livro Azul, na verdade.

Em um método, você teria conseguido um "fooobaar variável indefinida" erro de tempo de compilação.

Outras dicas

Suponho que o pensamento é que todas as referências de classe deve implicar uma classe de algum tipo de modo que a referência nulo implica Object, que é a superclasse de tudo.

Squeak faz mais do jeito que você esperaria:

inheritsFrom: aClass 

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

texto do link

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top