2012-04-03 102 views
1

Tcl 8.4。tcl使用名稱空間名稱中的變量

我有這個namespace樹:

namespace eval menu_tree { 

    #-------------------------------------------------------------------------- 
    ## Main Menu 
    namespace eval main_menu { 
     variable title "Main Menu" 
    } 

    #-------------------------------------------------------------------------- 
    ## Setup Menu 
    namespace eval setup_menu { 
     variable title "Show Setup Information" 
    } 

    #-------------------------------------------------------------------------- 
    ## Help Menu 
    namespace eval help_menu { 
     variable title "Show Help Information" 
    } 
} 

當時的想法是有這樣的功能:

proc print_title {menu} { 
    puts $menu::title 
} 

這將很好地工作全局變量。但是,從我所能找到的方面來說,需要在命名空間名稱中使用'$'。我試圖在網上找到答案,但沒有出現。 有誰知道如何去做,如果它甚至有可能?

謝謝, -Ilya。

回答

4

那麼,這裏的關鍵方法是記住「原來的Tcl」根本沒有那個「$」語法糖原來的方式來獲得一個變量的內容是一個參數調用set

set foo bar ;# sets variable "foo" to contain the value "bar" 
puts [set foo] ;# prints the value contained in variabe "foo" 

因此你可能應該使用類似

proc print_title {menu} { 
    puts [set ${menu}::title] 
} 

使${menu}::title擴展到名字然後set檢索變量的值。

請注意圍繞單詞「menu」使用大括號 - 沒有它們,Tcl會嘗試解引用名爲「menu :: title」的變量,這可能不是您想要的。

另一件需要注意的事情是print_title的行爲在很大程度上取決於「menu」參數的內容:在展開後,set命令必須看到一個應該能夠解析的字符串, a set of rules。除非知道更多細節,否則很難獲得進一步的建議。

有關$set主題的更多信息,請參閱this question

+0

'$ {menu}'就是訣竅。最終工作的代碼是這樣的:'puts [set menu_tree :: $ {menu} :: title]' – ilya1725 2012-04-04 01:17:32

+1

如果你在一個過程中操作兩次相同的變量,使用'upvar'更容易它以一個局部變量名稱。 'upvar menu_tree :: $ {menu} :: title fruitbat;放$ fruitbat' – 2012-04-04 07:10:57

相關問題