我在 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
有没有办法在不移动类外部并暴露公共变量的情况下克服它?