另一个命名空间或两个不同命名空间内的命名空间:结果是相同的

问题描述 投票:0回答:1

我看不出这两个脚本之间的区别。

# 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
,例如源......。

tcl
1个回答
0
投票

在第一个脚本中,您使用了 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 ...?"
© www.soinside.com 2019 - 2024. All rights reserved.