0

我在 iTcl 中构建了一个类似单例的类,它是由一个静态方法 (proc) 制成的,该方法被调用并决定是否创建一个新对象:

itcl::class sparamParser {

    #Static
    private common files
    array set files {}
    private common count 1

    proc parserInit {file_name} {
        if {![file exists $file_name]} {
            kg_log "-E- file $file_name doesn't exist"
            return
        }

        if [info exists files($file_name)] {
            if [$files($file_name) true] {
                if {[file mtime $file_name] == [$files($file_name) getDate]} {
                    return [lindex $files($file_name) 0]
                }
            }
        }
        set files($file_name) [sparamParser "parser_${count}" $file_name]
        incr count
        return $files($file_name)
    }
    #non static

    private variable matrix
    array set matrix           {}
    private variable ports     [list ]
    private variable file_name {}
    private variable date      {}


    constructor {fname} {
        set file_name $fname
        set date [file mtime $file_name]
        puts "start parsing $file_name"
        set matrix(1,1) [list 1 1]
        set matrix(1,2) [list 1 2]
        set matrix(2,1) [list 2 1]
        set matrix(2,2) [list 2 2]
        lappend ports "port 1"
        lappend ports "port 2"
        puts "finished pasrsing $file_name"
    }
    method true {} {
        return 1
    }
    method getFileName {} {
        return [file tail $file_name]
    }
    method getFullPath {} {
        return $file_name
    }
    method getNumPorts {} {
        return [llength $ports]
    }
    method getPort {num} {
        return [lindex $ports [expr $num + 1]]
    }
    method getAllPorts {} {
        return $ports
    }
    method getPlot {i j} {
        return $martix(${i}${j})
    }
    method getDate {} {
        return $date
    }

}

但是当我调用sparamParser::parserInit返回给我的对象时,返回给我的对象是在sparamParser命名空间中,而不是在根命名空间中,所以为了解决它,我需要调用sparamParser::parser_1并且我不能只使用sparam_1. proc有没有办法在不移动类外部并暴露公共变量的情况下克服它?

4

1 回答 1

2

您可以尝试使用解析器命令的完整限定名,方法是在它前面加上::

set files($file_name) [sparamParser "::parser_${count}" $file_name]
于 2012-08-01T14:47:16.327 回答