Tcl 访问在不同命名空间中打开的文件处理程序
如何访问/关闭在不同命名空间中打开的文件处理程序 例如:Tcl 访问在不同命名空间中打开的文件处理程序,tcl,Tcl,如何访问/关闭在不同命名空间中打开的文件处理程序 例如: package provide MyProcs 1.0 namespace eval ::MyProcs { # Export commands namespace export run_my_proc } proc ::MyProcs::run_my_proc {log} { global log_fh set log_fh [open "log" "r"] } 可执行文件代码: lappend auto_pa
package provide MyProcs 1.0
namespace eval ::MyProcs {
# Export commands
namespace export run_my_proc
}
proc ::MyProcs::run_my_proc {log} {
global log_fh
set log_fh [open "log" "r"]
}
可执行文件代码:
lappend auto_path /path/to/my/package
package require ::MyProcs 1.0
MyProcs::run_my_proc "some_file_name"
close MyProcs::${log_fh}
然后获取此错误:
原始错误:找不到名为“MyProcs::log\u fh”的频道当您声明
global log\u fh
时,global
命令指定log\u fh
在全局命名空间中,而不是在您的命名空间中。有几种方法可以解决此问题:
指定命名空间:
global ::MyProcs::log_fh
使用变量
命令(用于创建和初始化命名空间变量):
参考资料:,我看不出您在哪里初始化日志。如果该变量不存在,您的程序将无法访问它。@BradLanam添加到代码示例除了Brad Lanam的建议外,请注意,您不能使用
MyProcs:${log\u fh}
访问中的变量log\u fh
。名称空间成为(限定的)变量名的一部分,如下所示:close$::MyProcs::log\u fh
。在:MyProcs
名称空间中计算的代码当然可以使用名称log\u fh
,而不使用名称空间。@PeterLewerin不幸的是(对我来说),这不太正确。我使用了很多代码:$sysvars::v(废话)
和sysvars
是一个名称空间,而我目前在另一个名称空间中。显然,Tcl的变量查找算法处理得很好。这是一个我还没有完成的代码清理项目。正如您所指出的,使用完全限定名称无疑是一种最佳实践。是的,如果使用错误的方法,可能会在某些地方引起问题。@BradLanam:是的,如果您在foobar
命名空间中,并尝试解析sysvars::v(blah)
,解析程序首先在foobar
中查找sysvars
命名空间,然后在全局命名空间中查找。(). 我的评论主要是关于MyProcs::${log\u fh}
表单。
namespace eval ::MyProcs {
variable log_fh
...
}
proc ::MyProcs::run { } {
variable log_fh
...
}