我有一个使用struct::matrix
包的脚本。以下是基本我正在使用的代码:
body className::methodName {args} {
# ...
::struct::matrix mat
set CSV_file_handle [open $CSV_file_path]
csv::read2matrix $CSV_file_handle mat , auto
close $CSV_file_handle
set workbook_list [mat serialize]
# ...
}
执行文件时,错误会增加(省略不相关的信息):
$ tclsh script.tcl
invalid command name "mat"
while executing
"$m columns"
(procedure "Split2matrix" line 25)
invoked from within
"Split2matrix $alternate $m $data $sepChar $expand"
(procedure "csv::read2matrix" line 87)
invoked from within
"csv::read2matrix $CSV_file_handle mat , auto"
(object "::classObject" method "::className::methodName" body line ...)
当行::struct::matrix mat
转移到全局范围时,一切正常
在方法体内定义mat
对象时,您知道如何使其工作吗?
编辑: 忘了提 - 从代码中可以看出,我也在使用CSV包!
答案 0 :(得分:3)
正如格伦杰克曼所说,这是命名空间问题。如果在全局范围内调用以下语句:
set m [::struct::matrix mat]
puts "m is $m" ;# ==> m is ::mat
但是,在你的类中(我假设你使用Itcl),那么名称空间有点不同:
body className::methodName {args} {
# ...
set m [::struct::matrix mat]
puts "m is $m" ;# ==> m is ::className::mat
不必处理名称空间,而是采用不同的(如果不是更好的话):使用自动命名:
body className::methodName {args} {
# ...
set mat [::struct::matrix]
puts "mat is $mat" ;# ==> mat is ::className::matrix1
从现在开始,您只需要处理$mat
,它可以在类范围内外工作。当然,如果要使用其他方法中的$mat
,则需要将其保存为类变量或从一种方法传递到另一种方法(例如,通过return
语句)。