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。
答案 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。