Tcl中如何限制命名空间集合的可调用命令范围
Tcl中如何限制命名空间集合的可调用命令范围
嗨,这个问题问得很实用!你现在遇到的情况是因为命名空间集合默认会动态同步命名空间里的导出命令列表——当你在另一个文件里给myNS新增cmd4到导出列表时,make这个集合命令会自动把它纳入可调用的子命令范围里。
要限制只能调用cmd1、cmd2、cmd3,其实很简单,只需要在创建命名空间集合的时候,显式指定允许的子命令列表就行,用-subcommands参数固定范围:
修改你的file1.tcl代码如下:
# file1.tcl namespace eval myNS { # 显式指定集合允许的子命令,固定为cmd1、cmd2、cmd3 namespace ensemble create -command ::make -subcommands {cmd1 cmd2 cmd3} namespace export cmd1 cmd2 cmd3 }
这样一来,哪怕你在file2.tcl里执行namespace export cmd4,当你尝试调用make cmd4 $args时,Tcl就会抛出错误,提示你这个子命令不被允许,完美限制了可调用的范围。
补充个原理:默认情况下,命名空间集合的子命令是“动态绑定”的,会自动追踪命名空间的导出命令。而当你显式设置-subcommands参数后,集合就会使用你指定的静态列表,不再自动同步后续新增的导出命令。
如果之后你需要调整允许的子命令,也可以用namespace ensemble configure来修改:
# 比如后续想新增cmd5到允许列表 namespace ensemble configure ::make -subcommands {cmd1 cmd2 cmd3 cmd5}
备注:内容来源于stack exchange,提问作者Mkn
相关产品推荐
相关产品推荐

