Tcl 命名空间定义

Tcl namespace definition

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

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

一般来说,这取决于代码所在的上下文运行。如果是全局命名空间中的运行,则两者有的区别。如果它是 运行 在另一个名称空间内(例如,为了论证而在 ::foo 中),则存在差异(因为创建了 ::foo::somenamespace)。

对于包来说,这没什么区别,package ifneeded 提供的脚本——因此 package require 提供的 运行——实际上是 运行 这一行(在 tclPkg.c, 在函数 PkgRequireCore):

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

也就是说,它们 在全局上下文中总是 :: 命名空间。

有点像路径名。如果您在根目录(未命名的 / 路径)中,使用 bar/bar 没有区别:两者都指的是 /bar 目录。如果你在/foo,你用bar还是/bar就很重要了:第一个指的是/foo/bar目录,第二个还是指/bar目录。

:: 类似于命名空间名称的 /。在根命名空间(空 :: 名称)中,使用 bar::bar 没有区别:两者都引用 ::bar 命名空间。如果你在 ::foo 中,那么你使用 bar 还是 ::bar 就很重要了:第一个指的是 ::foo::bar 命名空间,第二个仍然指的是 ::bar命名空间。

文档:namespace