oo::define는, 현재의 네임 스페이스가 관련하여 생성되는 객체의 이름을 해결하기 위해 (즉, 절대 이름이 아닌 경우). 즉, 규정되지 않은 이름을 가진 다른 오브젝트의 메소드 내에서이를 호출하면, 작성한 오브젝트가 다른 오브젝트 내부에 위치하게됩니다. (create
메서드의 결과를 검토하면 일반 클래스에 대해 생성 된 개체의 정규화 된 이름입니다.) 즉, 외부 개체가 소멸되면 내부 개체도 소멸됩니다. 바깥 쪽 개체의 인스턴스 네임 스페이스가 삭제되고 그 안에있는 명령이 제거됩니다. 전화를하는 것이 좋다, 그러나
::oo::Obj19::in
Hi from an Outer
Hi from an Inner
: 같은 것을 인쇄
oo::class create Inner {
destructor {
puts "Hi from an Inner"
}
}
oo::class create Outer {
method makeAnInner {} {
puts [Inner create in]
}
destructor {
puts "Hi from an Outer"
}
}
Outer create out
out makeAnInner
out destroy
(네임 스페이스 이름이 이가 다름)이 :
의 몇 가지 간단한 클래스를 사용하여 증명하자 내부 객체의 destroy
메소드를 직접적으로 호출하면 소멸자에서 발생하는 모든 오류가 무시되지 않습니다. (다른 파괴 체계를 사용하면 현재 내부 API가 여러 가지 이유로 추한 이유로 오류보고를 안전하게 보존 할 수 없습니다. 특히 훨씬 더 광범위한 삭제가 발생하는시기에 사용되는 삭제 경로이기도합니다.
시도해 보셨습니까? 약간의 테스트 코드 작성? 'class2'에 대한 소멸자에 빠른'puts' 명령은 당신에게 즉시 알려줄 것입니다. –