2012-08-01 21 views
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和揭示共同變量的情況下克服它?

回答

2

,你可以嘗試用::前面加上使用全限定名解析器命令:

set files($file_name) [sparamParser "::parser_${count}" $file_name] 
相關問題