tcl在命名空间名称中使用变量

时间:2012-04-03 20:06:00

标签: tcl

Tcl 8.4。

我有这个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。

1 个答案:

答案 0 :(得分: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