Tcl名称空间定义

时间:2015-10-16 10:35:04

标签: namespaces tcl

我找不到答案使用double ::(当我读取两者都使用的源文件时)命名空间定义的区别是什么:

namespace eval somenamespace {
}

namespace eval ::somenamespace {

}

样品没有:: https://github.com/tcltk/tcllib/blob/master/modules/generator/generator.tcl#L16

示例:: https://github.com/tcltk/tcllib/blob/master/modules/ftp/ftp.tcl#L56

2 个答案:

答案 0 :(得分:1)

通常,它取决于运行代码的上下文。如果它在全局命名空间中运行,则两者之间存在 no 差异。如果它在另一个命名空间内运行(例如,为了参数而在::foo中),那就有区别(因为一个创建::foo::somenamespace)。

对于包没什么区别,package ifneeded提供的脚本 - 因此由package require运行 - 实际上是由这一行(tclPkg.c内部,在函数{{3}中运行的}}):

        code = Tcl_EvalEx(interp, script, -1, TCL_EVAL_GLOBAL);

也就是说,他们在全局上下文::命名空间中始终

答案 1 :(得分:1)

它有点像路径名。如果您位于根目录(未命名的/路径)中,则使用bar/bar时没有任何区别:两者都引用/bar目录。如果您在/foo,如果您使用bar/bar,则非常重要:第一个引用/foo/bar目录,第二个引用/bar目录1}}目录。

对于命名空间名称,

::/类似。在根命名空间(空::名称)中,如果您使用bar::bar,则没有区别:两者都引用::bar命名空间。如果您在::foo,如果您使用bar::bar,则非常重要:第一个引用::foo::bar命名空间,第二个引用::bar命名空间1}}名称空间。

文档:namespace