在类方法中定义struct :: matrix对象

时间:2013-12-05 22:49:11

标签: tcl

我有一个使用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包!

1 个答案:

答案 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语句)。