2017-03-15 8 views
1

이의 말을하자,의 내가 지금

oo::class create class1 { 
    method bar {} { 
     class2 create bee 
     bee method1 
    } 
} 

을 만들 OO :: 클래스에 의해 생성, Class1의가 있다고 가정하자 내가 명시 적으로 티클의 2 클래스의 인스턴스 내에서 1 개 클래스의 인스턴스를 32 파괴해야합니까 이 코드를 가지고 :

class1 create po 
po bar 
po destroy 

내가 po 내에서 인스턴스 꿀벌을 파괴합니까? 또는 po : bee도 명시 적으로 파괴해야합니까?
감사합니다.

+0

시도해 보셨습니까? 약간의 테스트 코드 작성? 'class2'에 대한 소멸자에 빠른'puts' 명령은 당신에게 즉시 알려줄 것입니다. –

답변

1

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가 여러 가지 이유로 추한 이유로 오류보고를 안전하게 보존 할 수 없습니다. 특히 훨씬 더 광범위한 삭제가 발생하는시기에 사용되는 삭제 경로이기도합니다.

1

beeclass1 인스턴스의 네임 스페이스에 만들어지며 인스턴스가 파괴되면 네임 스페이스가 삭제되고 bee도 처리됩니다.

그래서 당신은 명시 적으로 그것을 파괴 할 필요가 없습니다,하지만 당신은 당신이 떨어져 가고 싶어 다른 네임 스페이스의 인스턴스를 처리하는 경우는 소멸자에서 자동으로 수행하도록 설정할 수 있습니다

oo::define class1 destructor {bee destroy} 

하는 경우 하나는 생성 인스턴스가 파괴 될 때 이 아닌이 아닌 인스턴스를 생성하는 메소드를 원한다. 생성 된 인스턴스에 다른 네임 스페이스에 이름을 지정하거나 ::bee 또는 set cee [po bar]과 같이 호출하여 class2 new의 결과를 반환하도록합니다. 새로운 인스턴스는 ... $cee방법의 인수로 사용할 수 있습니다

문서 : oo::classcreate 방법은 선호 oo::object