2009-03-09 6 views
1

GNU 스몰 토크의 inheritsFrom : 메소드는 매개 변수로 전달 된 정의되지 않은 모든 클래스 이름에 대해 true를 반환합니다. 이렇게하면 프로그램을 디버깅하기가 매우 어려울 수 있습니다. 에 GPRS 클래스에서이에 대한 코드를 보면, 그것은 다음과 같습니다예 : Object inheritsFrom : fooobaar가 Smalltalk에서 true를 반환합니까?

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 
] 

라인 aClass isNil ifTrue을 : [^ TRUE] 범인이지만, 그것이 방식으로 나는 제정신 이유를 찾고 있어요 이 방법으로 코딩. (저는 스몰 토크의 세계에 처음 접하고 배우려고합니다.)

고마워요.

답변

3

이이 예외와 관련된 것이 아니라 정의되지 않은 변수에 대한되지 않습니다

Squeak 당신이 기대하는 것이 더 길 않습니다. GNU Smalltalk의 REPL 또는 그래픽 환경의 대본이나 작업 공간에서 정의되지 않은 변수는 모두 nil입니다. 예를 들어 Ruby에서는 그다지 다르지 않습니다.

실제로 "Object inheritsFrom : nil"을 수행하고 있습니다. 이는 사실입니다. 나는 그것이 공포에 틀렸다는 것을 몰랐다. 실제로 블루 북에서 출발 할 것입니다.

메서드에서 "fooobaar undefined"컴파일 타임 오류가 발생했습니다.

+0

Hum, Neil의 대답 (직접적으로 말할 수는 없지만)은 Object가 모든 것의 수퍼 클래스가 아니라는 점에서 잘못되었습니다. 어떤면에서 nil은 모든 것의 수퍼 클래스입니다. 예를 들어 GNU 스몰 토크의 Autoload 클래스는 Object가 아니라 nil에서 직접 상속받습니다. 다른 많은 예가 있습니다. –

2

모든 클래스 참조는 일종의 클래스를 내포해야하므로 nil 참조는 모든 것의 수퍼 클래스 인 Object를 의미한다고 생각합니다.

inheritsFrom: aClass 

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

link text

+0

이것이 내 기대에 더 가깝다는 사실이지만 실제로 예상되는 것은 예외가 발생할 것이라는 것입니다. – Eyvind

+0

스몰 토크는 전통적으로 예외를 많이 사용하지 않습니다. –