具有更改名称的变量的全局声明

时间:2017-02-22 06:01:11

标签: tcl

我已根据设备的端口号创建变量。如何将它们声明为全局,以便我可以在不同的函数中使用它们?

  set txresults_$portIndex [stc::get $generator1 \
                        -children-GeneratorPortresults] 

  set rxresults_$portIndex [stc::get $Analyzer1 \
                        -children-AnalyzerPortresults]

1 个答案:

答案 0 :(得分:2)

global命令可以放在一个过程的任何地方,而不仅仅放在它的顶部。

proc yourprocedure {...} {
    set portIndex [something here]

    # ...

    global txresults_$portIndex rxresults_$portIndex
    set txresults_$portIndex [stc::get $generator1 \
                          -children-GeneratorPortresults] 
    set rxresults_$portIndex [stc::get $Analyzer1 \
                          -children-AnalyzerPortresults]

    # ...
}

然而...

这样做可能是一个坏主意,因为使用变量命名变量有点烦人(你可以用[set …]而不是$…来做,或者做一个使用upvar的别名,但它仍然很烦人)。相反,您可能应该使用数组,因为这使代码更容易理解:

proc yourprocedure {...} {
    global txresults rxresults

    set portIndex [something here]

    # ...

    set txresults($portIndex) [stc::get $generator1 \
                          -children-GeneratorPortresults] 
    set rxresults($portIndex) [stc::get $Analyzer1 \
                          -children-AnalyzerPortresults]

    # ...
}

当你这样做时,你将所有那些变量命名变量分组到变量集合 - 数组 - 然后你可以通过以下方式在其他地方引用它们:

    global txresults
    do-something-with $txresults($portIndex)

在可理解性方面比这些替代方案更好:

    global txresults_$portIndex
    do-something-with [set txresults_$portIndex]
    upvar ::txresults_$portIndex txr
    do-something-with $txr