문제

TCL에서 다음과 같은 코드를 보았습니다.

namespace eval ::info {
    set count 0;
    set id 1;
    set role admin;

    namespace export *
}



proc ::info::setcount {
    set ::info::count 0;
}

proc ::info::setId {
    set ::info::id 1;
}

proc ::info::setRole {
    set ::info::role user;
}

::info 네임스페이스에 3개의 변수가 정의되어 있는데 3개의 procs(setcount setId setRole)가 네임스페이스에 선언되어 있지 않아 ::info 외부에 정의되어 있는 것 같은데 허용되나요?이건 어떻게 작동하나요?

도움이 되었습니까?

해결책

절차 ~이다 에 정의되어 있습니다. ::info 네임스페이스.그들은 단지 범위 안에 있지 않을 뿐입니다. namespace eval, 필요한 경우 네임스페이스를 생성한 다음 해당 컨텍스트 내에서 지정된 스크립트를 실행하는 명령입니다.네임스페이스의 컨텍스트 내에서 실행되면 방법이 변경됩니다. proc 해당 명령의 이름이 정규화되지 않은 경우 생성하는 명령을 배치합니다.네임스페이스는 namespace eval 부르다.하지만 변수는 네임스페이스에서 선언되어야 합니다.사람들을 사로잡을 수 있는 변수 해결과 관련된 정말 불쾌한 문제를 피할 수 있습니다.

개인적으로 저는 다음과 같은 코드를 작성하는 것을 선호합니다.

namespace eval ::foo {
    proc bar ... {
        ...
    }
}

그러나 나는 다른 사람들이 나와 동의하지 않는다는 것을 알고 있습니다.Tcl은 두 구성표 모두에서 잘 작동하므로 원하는 것을 작성하십시오.

다른 팁

namespace eval 명령

  1. 존재하지 않으면 네임 스페이스를 생성합니다
  2. 는 해당 네임 스페이스 내에서 제공된 코드를 실행합니다.

    기본 네임 스페이스는 다음과 같기 때문에 모든 procs 인 모든 procs 인 것으로 정의됩니다.

    • 절대 네임 스페이스 앞에있는 경우 지정된 네임 스페이스 에 해당 명령을 정의합니다.
    • 상대 네임 스페이스가 앞에있는 경우 현재 네임 스페이스 를 기준으로 해당 명령을 정의합니다.

      그런

      namespace eval bob {
          namespace eval joe {
              proc proc1 {} {}
          }
          proc proc2 {} {}
          proc ::proc3 {} {}
          proc joe::proc4 {} {}
      }
      proc proc5 {} {}
      proc bob::joe::proc6 {} {}
      proc ::bob::joe::proc7 {} {}
      
      .

      다음 명령이 존재합니다

      ::bob::joe::proc1
      ::bob::proc2
      ::proc3
      ::bob::joe::proc4
      ::proc5
      ::bob::joe::proc6
      ::bob::joe::proc7
      
      .

      전역 네임 스페이스에서 호출 할 때 전역 네임 스페이스의 명령은 :: 또는 그렇지 않은 경우에 사용할 수 있습니다. 모든 네임 스페이스의 명령에 대해서도 마찬가지입니다.

      namespace eval bob {
          proc2 ;# calls ::bob::proc2
          ::proc5 ;# calls ::proc5 (proc5 in the global namespace)
          joe::proc4 ;# calls ::bob::joe::proc4
      }
      
      .

      원시 명령 이름 (Namespace 한정자가 전혀없는 경우)은 현재 네임 스페이스를 찾은 다음 명령을 찾지 못하면 전역 네임 스페이스입니다.

      namespace eval bob {
          proc5 ;# calls ::proc5 since there is no ::bob::proc5
      }
      
      .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top