tcl在名称空间名称中使用变量
tcl8.4 我有一个tcl在名称空间名称中使用变量,tcl,Tcl,tcl8.4 我有一个命名空间树: namespace eval menu_tree { #-------------------------------------------------------------------------- ## Main Menu namespace eval main_menu { variable title "Main Menu" } #-----------------------------
命名空间
树:
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.好吧,这里的关键方法是要记住,“原始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\u title
的行为在很大程度上取决于“menu”参数的内容:展开后,set
命令必须看到一个它应该能够解析的字符串,这取决于。不过,在了解更多细节之前,很难得到进一步的建议
有关
$
vsset
主题的更多信息,请参阅。好吧,这里的关键方法是记住,“原始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\u title
的行为在很大程度上取决于“menu”参数的内容:展开后,set
命令必须看到一个它应该能够解析的字符串,这取决于。不过,在了解更多细节之前,很难得到进一步的建议
有关
$
vsset
主题的更多信息,请参阅。${menu}
就是其中的诀窍。最后运行的代码是:put[set menu_tree::${menu}::title]
如果在一个过程中操作同一个变量两次,那么使用upvar
将其别名为局部变量名会更容易<代码>upvar菜单树::${menu}::title FROUTTBAT;把$furtbat${menu}
放进去就是诀窍。最后运行的代码是:put[set menu_tree::${menu}::title]
如果在一个过程中操作同一个变量两次,那么使用upvar
将其别名为局部变量名会更容易<代码>upvar菜单树::${menu}::title FROUTTBAT;将$FURTBAT放入