【问题标题】:How do I access a variable outside of a proc如何访问 proc 之外的变量
【发布时间】:2019-01-30 18:44:40
【问题描述】:

我正试图围绕 Tcl 变量范围进行思考,但我坚持认为这是一个简单的概念:如何访问我在我的 proc 之外定义的变量,但我不显式传递给 proc?

我试图避免设置一堆全局变量,而只访问我在特定命名空间中定义的变量。我需要在下面的代码中添加什么,以便 proc 可以访问变量a,这显然不在 proc 的范围内?

set a apples
proc myList {b c} {
   puts [concat $a $b $c]
}

【问题讨论】:

    标签: variables scope global-variables tcl


    【解决方案1】:

    你可以使用upvar:

    set a apples
    proc myList {b c} {
        upvar a a
        puts [concat $a $b $c]
    }
    

    或者,稍微扩展示例以显示“源”变量不必存在于全局范围内:

    proc p1 {} { set a 10; p2 }
    proc p2 {} { upvar 1 a b; puts "in p2, value is $b" }
    p1
    

    输出

    in p2, value is 10
    

    如果在命名空间中定义了a,则可以使用variable

    namespace eval foo {
        set a apples
        # OR
        # variable a apples
    }
    
    proc foo::myList {b c} {
        variable a
        puts [concat $a $b $c]
    }
    

    或者如果a 是在全局范围内创建的,您仍然可以在没有global 函数的情况下使用:: 访问它(我将为此引用this SO question):

    proc myList {b c} {
        puts [concat $::a $b $c]
    }
    

    【讨论】:

    • 不想踩到你的脚趾:扩展 upvar 示例。
    • 通常认为upvar 对调用者(尤其是过程或方法)中未明确提供给您名称的变量的形式是错误的;它大大降低了代码的可重用性,并使一切变得更加脆弱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多