TCL名称空间错误

  • 本文关键字:错误 空间 TCL tcl
  • 更新时间 :
  • 英文 :


我在命名空间" b"中定义了几个函数。然后,我将这些功能导入命名空间:: x :: y,因此:

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中发生"乐趣"。我在做什么错?

这不是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包括一个(如果您有贡献的扩展名),并且有许多用于扩展包的旧版本。

最新更新