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_1procクラスの外に移動して共通変数を公開せずにそれを克服する方法はありますか?

4

1 に答える 1

2

::パーサーコマンドの前に:を付けることで、パーサーコマンドに完全修飾名を使用することができます。

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