在另一个过程中调用带有或不带有命名空间的过程

问题描述 投票:0回答:1

我有这个程序:

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
的时间,是同一时间)。
这是风格问题,还是使用其中一种更好?

tcl
1个回答
0
投票

总结:使用任何有效且对您有意义的形式,除非您有充分的理由不这样做。


当您使用不完全限定的命令名称(即以

::
开头)时,该命令名称相对于当前解析上下文是已解析。当前解析上下文通常基于查找当前命名空间,然后查找当前命名空间路径上的命名空间(参见
namespace path
),最后查找全局命名空间。 (不需要,但大多数代码不会安装备用分辨率引擎。)

过程的当前命名空间是包含该过程的任何过程。 这只适用于过程。您可以使用

namespace eval
apply
显式选择不同的命名空间;
tailcall
命令还可以与解析交互,因为它会在丢弃之前在当前上下文中解析。如果您使用 TclOO,它会使用名称空间和方法完成更复杂的事情; 大多数情况下,您应该将当前命名空间视为当前对象实例。

按照约定,如果记录的 Tcl 命令在其记录名称中没有

::
,则该命令位于全局命名空间中,但通常应用作非限定名称。并非所有地方都是如此,但使用记录的名称应该可行(除非您正在做一些棘手的事情,例如在当前名称空间中创建名为
set
if
open
等的命令)

命令解析通常会被积极缓存(命令不会直接更改为字节码):缓存机制知道何时无效,因此您可以忽略它。写你想要的,如果你认为有问题,只担心速度。

© www.soinside.com 2019 - 2024. All rights reserved.