0
我已經在iTcl中構建了一個像類一樣的單例,並且它是使用被調用的靜態方法(proc)創建的,並決定是否創建一個新的對象:iTcl:如何創建一個可以返回根名稱空間中的對象的靜態方法
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
和揭示共同變量的情況下克服它?