我看不出这两个脚本之间的区别。
# First script
namespace eval ns1 {
namespace eval ::ns2 {
proc name {} {
puts ok
}
}
}
# Second script
namespace eval ns1 {}
namespace eval ns2 {
proc name {} {
puts ok
}
}
在这两种情况下,调用
name
过程是相同的写法。我的示例非常简单,但我认为我的第一个脚本保护了 ns2
命名空间,并且仅当 name
命名空间存在时我才能调用 ns1
命令。ns2
,例如源......。
在第一个脚本中,您使用了 ns2 的根命名空间 (::)。这意味着它会在 ::ns2 命名空间中创建您的过程。您可以通过使用完整命名空间或使用 info 命令运行它来确认这一点,例如
% ::ns2::name
ok
% info command ::ns2::name
::ns2::name
如果您想在 ns2 中创建 proc,其中 ns2 是 ns1 的子命名空间,只需省略双冒号即可,例如
namespace eval ns1 {
namespace eval ns2 {
proc name {} {
puts ok
}
}
}
% ::ns1::ns2::name
ok
% info command ::ns1::ns2::name
::ns1::ns2::name
为了运行名称 proc,您需要显式或在 eval 中提供完整的命名空间。如果您只是尝试运行 name,您会收到名称空间错误:
% name
wrong # args: should be "namespace subcommand ?arg ...?"