我找不到答案使用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
答案 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