命名空间映射:保留主命名空间

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

与这个问题相关,在评论中他建议我使用

-map
而不是
-command

我正在尝试应用它,但遇到了一个问题:我想像这样保留我的
main
命名空间
ns1
:

namespace eval ns1 {
    namespace eval ::ns2 {
        namespace ensemble create -map {
            test ::ns1::name
        }
    }
}
# Call proc 
ns2 test

这可行,但与我上一个问题相关,这相当于这样写:

namespace eval ns1 {}
namespace eval ns2 {
    namespace ensemble create -map {
        test ::ns1::name
    }
}

我担心

::ns2
存在于另一个包或文件中,这就是为什么我想保留
ns1
作为主命名空间,并使
ns2
成为
ns1
的子级。所以我可以这样调用我的测试命令:
ns2 test
而不是
ns1::ns2 test

tcl
1个回答
0
投票

对于您自己的代码,请使用您想要的任何代码。使用

-map
的限制是 Tcl 自己的集合的一个功能,用于像
string
info
这样的命令,并且允许字节码编译器进入内部,而不需要复杂的多阶段命令解析(该代码足够复杂,因为是的,谢谢!)。这不是您在集成中打开的功能(您没有编写字节码编译器插件),因此您也没有随之而来的限制。

在默认模式下,集成使用命名空间的导出命令。这涉及动态搜索。如果您给出

-subcommands
-map
,您将跳过该搜索。
-subcommands
选项可以让您直接提供搜索结果(用于子命令匹配和错误消息生成),并且
-map
还可以让您准确设置如何查找每个子命令的实现,而不是将其隐式保留在命名空间。

你永远不需要

-command
;您可以在创建后直接使用
rename
命令。
-command
选项只是让你跳过这一步,直接使用给定的名称进行集成。集成会记住它们的初始名称空间(与过程不同)。

简而言之,在制作集成时,您根本不需要任何选项,但使用

-subcommands
-map
来定义 API 无论如何可能是一个好主意。这样,您就不会意外出现实现片段。

© www.soinside.com 2019 - 2024. All rights reserved.