TclOO技术问题:如何创建无需命名空间前缀访问的对象?
解决TclOO对象无需命名空间前缀访问的问题
问题原因
在命名空间内的过程中调用oo::object create时,若对象名称不带命名空间前缀,Tcl会默认将对象创建在当前过程所在的命名空间(此处为myNs)中。所以你实际创建的是myNs::myC1这类带命名空间的对象,全局作用域下直接用myC1自然找不到。
报错信息翻译:
错误:无效的命令名称 "myC1"
解决方案
创建对象时明确指定全局命名空间前缀::,让对象直接创建在全局作用域,这样无需前缀就能访问。
修正后的代码
namespace eval myNs {} proc myNs::my_proc {} { for { set i 1} {$i < 5} {incr i} { # 明确指定全局命名空间创建对象 oo::object create ::myC${i} oo::objdefine ::myC${i} [list \ method get {} [list \ return $i ] \ ] } } myNs::my_proc myC1 get ;# 现在可正常执行,返回1
补充说明
- 前缀
::代表全局根命名空间,所有带该前缀的名称都会直接绑定到全局作用域 - 若要在其他指定命名空间创建对象,可使用
::targetNs::objName的格式明确目标位置
内容的提问来源于stack exchange,提问作者Mkn
相关产品推荐
相关产品推荐

