2012-12-26 6 views
1

내가 내보내는 네임 스페이스 "b"에 정의 된 여러 함수가 있습니다. 나는 다음 thusly 히 :: X :: Y를 네임 스페이스 이러한 기능을 가져옵니다tcl 네임 스페이스 오류

namespace eval ::x::y "namespace import fun" 

몇 시간 후에 내가 할 :

재미가하는
namespace eval ::x::y fun 

:

proc fun {} { 
    puts "[namespace current]" 
    uplevel {puts "[namespace current]"} 
} 

인쇄 무엇 입니다 :

 
::b 
::x::y 

내가 원하고 필요로는 '재미를 위해 무엇 ':: x :: y에서 일어나고 :: b에서는 일어나지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

한 네임 스페이스에서 다른 네임 스페이스로 프로 시저 이름을 가져 오더라도 프로 시저가 정의 된 네임 스페이스가 변경되지 않으므로 프로 시저가 호출 될 때 현재 네임 스페이스가 변경되지 않습니다. 아마 당신은 당신의 문제를 더 많이 나눌 수 있고 다른 아이디어가 생길 것입니다. –

+0

가난한 사람의 물건을하려고하는 경우 ** stop! **이 권리를 얻는 _real_OO 시스템 (또는 구운 음식을 가지고있는 8.6.0) 중 하나를 사용하십시오. –

답변

1

Tcl의 네임 스페이스가 작동하는 방식이 아닙니다. 각 프로시 저는 이름이있는 정확히 하나의 네임 스페이스와 연관됩니다. namespace import을 사용하면 프로 시저에 대한 별칭이 다른 네임 스페이스에서 프로 시저를 호출 할 수 있도록 가져 오는 네임 스페이스에 배치되지만 프로 시저 자체는 원래 네임 스페이스에 남아 해당 프로 시저에서 실행됩니다.

호출자의 네임 스페이스를 알고 싶다면 uplevel namespace current (또는 다소 바람이 세지 만 효율적인 버전은 uplevel 1 {namespace current})을 사용하십시오. 이것은 네임 스페이스에 프로 시저를 호출하는 데 사용 된 명령이 포함 된 것을 실제로 알려주지는 않습니다. 당신은 많은 그때는 아마 뭔가 잘못하고 있다는 것을 필요로하는 경우, 물론

namespace qualifiers [uplevel 1 [list namespace which [lindex [info level 0] 0]]] 

: 그것을 위해, 당신은 (호출 된 명령)이 괴물이 필요합니다. 정보를 얻는 데 필요한 코드의 길이와 복잡성을 고려할 때 분명합니다.

특히이 기능을 사용하여 개체 방향을 지정하는 경우 해당 개체를 사용하지 않는 실제 개체 시스템을 사용하지 마십시오. 세부 권리. Tcl 8.6.0에는 one (기여한 확장 기능이있는 경우 two)이 포함되어 있으며 이전 버전에는 확장 패키지로 사용할 수있는 파일이 많이 있습니다.

+0

사실 @Donal, 코드를 여러 네임 스페이스와 공유하려고했는데 기본적으로 다른 루틴에있는 변수와 동일한 루틴 액세스 권한을 가지고 있습니다. 내가 작업하고있는 경우, 각 페이지에 창과 사용할 수있는 많은 기능이있는 페이지를 구현했습니다. 결국에는 각 이름 공간에 함수를 포함 시켰습니다. 이 응용 프로그램은 명명 된 행과 열이있는 tcl/tk 스프레드 시트 프로그램 용입니다. 그것의 초기 버전은 tk #로 sourceforge에 있습니다. –

+0

@Tom 정말, 당신이 객체 오리엔테이션을 재발 명하고있는 것처럼 (처음에는 그것에 대해 추측합니다) 들립니다. 나는 그 일이 끝난 (나는 3-4 번 해냈다!) 시간을 잊어 버렸다. 다시하지 말아라. 어려운 가장자리 상황을 다루는 아주 좋은 생산 시스템 (Itcl, XOTcl, TclOO)이 있습니다. 자신을 많이 저장하십시오! –

+0

아, TclOO는 커버 아래에있는 네임 스페이스입니다. 게다가 영리한 파견 코드도 ... –