1

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
}

这适用于全局变量。但是,据我所知,需要使用带有命名空间名称的“$”。我试图在网上找到答案,但没有任何结果。有谁知道该怎么做,如果它甚至可能?

谢谢你,-伊利亚。

4

1 回答 1

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命令必须看到一个它应该能够解析的字符串,这受制于一组规则。在了解更多细节之前,很难获得进一步的建议。

有关该vs主题的更多信息,请参阅此问题。$set

于 2012-04-03T21:04:15.553 回答