iTcl:如何创建可以返回根名称空间中的对象的静态方法

iTcl:如何创建可以返回根名称空间中的对象的静态方法,tcl,Tcl,我在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]} {

我在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
移到类外并公开公共变量的情况下克服它?

您可以尝试在解析器命令前面加上

set files($file_name) [sparamParser "::parser_${count}" $file_name]