如何访问 proc 之外的变量
How do I access a variable outside of a proc
我正在努力思考 Tcl 变量范围,但我坚持我认为是一个简单的概念:我如何访问我在我的 proc 之外定义的变量,但是我没有明确传递给过程?
我试图避免设置一堆全局变量,并且只访问我在特定命名空间中定义的变量。我需要在下面的代码中添加什么,以便 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]
}
或者,稍微扩展示例以显示 "source" 变量不必存在于全局范围内:
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]
}
我正在努力思考 Tcl 变量范围,但我坚持我认为是一个简单的概念:我如何访问我在我的 proc 之外定义的变量,但是我没有明确传递给过程?
我试图避免设置一堆全局变量,并且只访问我在特定命名空间中定义的变量。我需要在下面的代码中添加什么,以便 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]
}
或者,稍微扩展示例以显示 "source" 变量不必存在于全局范围内:
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]
}