我有一个使用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包!
正如Glenn Jackman所说,这是名称空间的问题。如果您在全局范围内调用以下语句:
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
语句)。