Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tcl在名称空间名称中使用变量_Tcl - Fatal编程技术网

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

tcl在名称空间名称中使用变量,tcl,Tcl,tcl8.4 我有一个命名空间树: namespace eval menu_tree { #-------------------------------------------------------------------------- ## Main Menu namespace eval main_menu { variable title "Main Menu" } #-----------------------------

tcl8.4

我有一个
命名空间
树:

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


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

好吧,这里的关键方法是记住,“原始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
命令必须看到一个它应该能够解析的字符串,这取决于。不过,在了解更多细节之前,很难得到进一步的建议


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

${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放入