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

时间:2012-08-01 13:51:31

标签: 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]} {
            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并暴露公共变量?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用完整限定名称作为解析器命令,方法是将其添加到::

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