我可以通过多种方式在 TCL 中实现包含防护,但这可能是我考虑过的最稳健的方式,无需知道任何技巧或捷径:
if { ! [info exists _THIS_FILE_] } {
set _THIS_FILE_ 1
# ...
}
但是,它很冗长,并且在所有内容上都引入了缩进。
有几种可能性。最接近您的提案但不引入所有代码缩进的方案是:
if {[info exists _THIS_FILE_]} return
set _THIS_FILE_ 1
# ...
当遇到
source
命令时,return
命令将停止脚本评估。
但是,我个人更喜欢以可以无害地多次获取源文件的方式编写源文件。这使得在开发过程中可以轻松更改代码,然后在已运行的程序中加载更新。
我认为执行您似乎正在寻找的操作的正确方法是将您可能想要从多个位置包含的文件转换为模块。这仅意味着您遵循一些命名文件的规则并将它们放置在模块路径上的目录中 (
tcl::tm::path list
),或者调整模块路径以包含文件所在的目录 (tcl::tm::path add $dir/mylib
)。然后,您可以在之前获取文件的所有位置中package require
模块。 Tcl 将只加载每个模块一次,因此不需要模块开发人员进行进一步的管理。