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