我有这个程序:
proc myNS::main {args} {
# Inside this procedure I can call another
# procedure with same namespace like this :
procedure2
# Or full namespace
myNS::procedure2
}
我经常看到这2个文字(我用
myNS::main
或procedure2
测量了我的过程myNS::procedure2
的时间,是同一时间)。总结:使用任何有效且对您有意义的形式,除非您有充分的理由不这样做。
当您使用不完全限定的命令名称(即以
::
开头)时,该命令名称相对于当前解析上下文是已解析。当前解析上下文通常基于查找当前命名空间,然后查找当前命名空间路径上的命名空间(参见 namespace path
),最后查找全局命名空间。 (不需要,但大多数代码不会安装备用分辨率引擎。)
过程的当前命名空间是包含该过程的任何过程。 这只适用于过程。您可以使用
namespace eval
和 apply
显式选择不同的命名空间; tailcall
命令还可以与解析交互,因为它会在丢弃之前在当前上下文中解析。如果您使用 TclOO,它会使用名称空间和方法完成更复杂的事情; 大多数情况下,您应该将当前命名空间视为当前对象实例。
按照约定,如果记录的 Tcl 命令在其记录名称中没有
::
,则该命令位于全局命名空间中,但通常应用作非限定名称。并非所有地方都是如此,但使用记录的名称应该可行(除非您正在做一些棘手的事情,例如在当前名称空间中创建名为 set
、if
、open
等的命令)
命令解析通常会被积极缓存(命令不会直接更改为字节码):缓存机制知道何时无效,因此您可以忽略它。写你想要的,如果你认为有问题,只担心速度。