【问题标题】:Tcl : pass all variables from main to procedureTcl:将所有变量从主传递到过程
【发布时间】:2017-08-04 19:49:15
【问题描述】:

在我的 tcl 脚本中,有一部分代码重复了很多次,所以我想把它做成一个过程。

问题是这部分使用了几十个变量,我想避免将它们作为参数传递给过程。有没有办法让所有变量对程序可见? (实际上我希望“main”像“goto”一样分支到过程,然后返回并继续 main)。

已编辑:它不需要是一个程序,请随时提出其他方法来执行此操作。重要的部分是不需要声明从 main 传递到函数/过程的所有变量/参数。

例子:

 proc dummy_proc {} {
 set var1 $var2
 set var2 $var3
 }

 set var2 2
 set var3 3
 dummy_proc 
 puts "$var1 $var2"
 # should print "2 3"

【问题讨论】:

    标签: tcl procedure


    【解决方案1】:

    使用global

    proc dummy_proc {} {  
      global var2 var3  
      set var1 $var2  
      set var2 $var3  
    }
    
    set var2 2  
    set var3 3  
    dummy_proc   
    puts "$var1 $var2"  
    

    如果你有很多全局变量想要传递,你可以使用一些foreach,但你必须有办法找到它们。
    例如所有全局变量都称为GLOBAL_<SOMEARG>

    proc dummy_proc {} { 
      foreach glb [info globals GLOBAL_*] { 
        global $glb 
      } 
      ... 
    }
    

    【讨论】:

    • 谢谢,重要的部分是不需要声明从 main 传递到函数/过程的所有变量/参数。所以这对我不起作用。我更新了我的问题以澄清这一点。
    【解决方案2】:

    这是可能的,但通常不建议这样做,因为它会使代码更难阅读(没有直接指示变量来自何处或变量值如何突然变化)。但是在某些情况下,这可以减少重复代码。

    使用upvar (https://www.tcl.tk/man/tcl8.6/TclCmd/upvar.htm):

    proc dummy_proc {} {
        upvar var1 v1
        upvar var2 v2
        upvar var3 v3
    
        set v1 $v2
        set v2 $v3
    }
    

    upvar 所做的是在本地范围内创建一个变量,该变量引用调用者范围内的另一个变量。

    您也可以尝试使用uplevel (https://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm):

    proc dummy_proc {} {
        uplevel {
            set var1 $var2
            set var2 $var3
        }
    }
    

    uplevel 的作用类似于upvar,但它实际上不是创建变量引用,而是在调用者的范围内执行代码。就好像你暂时回到调用者函数而不返回,执行一些代码然后回来。因为您在调用者的范围内执行代码,所以在调用者的范围内可见的所有变量在您升级的代码中都是可见的。 Uplevel 的行为几乎像宏而不是函数。

    【讨论】:

    • 谢谢,重要的部分是不需要声明从 main 传递到函数/过程的所有变量/参数。所以这对我不起作用。我更新了我的问题以澄清这一点。
    • @user2405602:你看到上层解决方案了吗?
    • 我刚看到,我试过了,我是一个快乐的露营者!它工作正常。非常感谢。
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2010-12-08
    • 2023-04-11
    相关资源
    最近更新 更多