variables - 如何访问过程之外的变量

标签 variables scope global-variables tcl

我试图理解 Tcl 变量作用域,但我坚持认为是一个简单的概念:如何访问我在过程之外定义的变量,但我没有显式传递给过程?

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

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

最佳答案

您可以使用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 函数的情况下使用 :: 访问它(I'对此,请引用 this SO question):

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

关于variables - 如何访问过程之外的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54447476/

相关文章:

ruby-on-rails - 如何使用 rails 3 中的命名路由覆盖范围路由?

variables - 如何在 PowerShell 中测试变量是否超过八个字符?

c++ - 程序自己声明变量

mysql - 创建一个 MySQL 过程变量,该变量在未提供时初始化

javascript - 澄清有关 Nicholas 的 "Maintainable JavaScript"第 199 页的一个 JavaScript 作用域

我可以在 C 中 free() 静态变量和自动变量吗?

C implicit extern for global variable,什么时候发生,它是如何工作的

Java如何访问try-catch block 之外的变量

database - MS access 2010 中的 web DB 将用户登录保存到全局变量中

c# - 将几个数字与变量 int 作为 IF 参数进行比较