与这个问题相关,在评论中他建议我使用
-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
对于您自己的代码,请使用您想要的任何代码。使用
-map
的限制是 Tcl 自己的集合的一个功能,用于像 string
和 info
这样的命令,并且允许字节码编译器进入内部,而不需要复杂的多阶段命令解析(该代码足够复杂,因为是的,谢谢!)。这不是您在集成中打开的功能(您没有编写字节码编译器插件),因此您也没有随之而来的限制。
在默认模式下,集成使用命名空间的导出命令。这涉及动态搜索。如果您给出
-subcommands
或 -map
,您将跳过该搜索。 -subcommands
选项可以让您直接提供搜索结果(用于子命令匹配和错误消息生成),并且-map
还可以让您准确设置如何查找每个子命令的实现,而不是将其隐式保留在命名空间。
你永远不需要
-command
;您可以在创建后直接使用 rename
命令。 -command
选项只是让你跳过这一步,直接使用给定的名称进行集成。集成会记住它们的初始名称空间(与过程不同)。
简而言之,在制作集成时,您根本不需要任何选项,但使用
-subcommands
或 -map
来定义 API 无论如何可能是一个好主意。这样,您就不会意外出现实现片段。