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



我有一个使用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语句)。

最新更新