如何在不使用catch的情况下检测TCL OO中是否已定义指定类
不用catch实现Tcl类加载检测的方法
你当前的场景是判断目标类foo是否已完成加载,有多种无catch的实现方案,适配不同的类框架场景:
1. 适配Tcl内置TclOO框架(Tcl 8.5+默认支持)
TclOO提供了原生的类检测命令,直接判断指定名称是否为已注册的类即可,无额外副作用:
if {![info object isa class foo]} { source "path_to_code" }
2. 适配ITcl(Incr Tcl)类框架
如果使用ITcl扩展定义类,可以通过itcl::find命令检索已存在的类:
if {[llength [itcl::find classes foo]] == 0} { source "path_to_code" }
3. 通用场景适配(所有Tcl类框架都可用)
Tcl中类本质上就是一个全局命令,因此可以直接通过info commands检测类命令是否存在,不需要依赖特定OO框架的API:
if {[llength [info commands foo]] == 0} { source "path_to_code" }
注意:你原有基于
catch的实现会实际触发foo类的实例化操作,如果类的构造函数存在读写文件、建立网络连接等副作用,会产生不必要的额外开销,上述方案都不会触发实例化逻辑,性能和安全性更好。
内容的提问来源于stack exchange,提问作者user1134991
相关产品推荐
相关产品推荐

