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