TCL中upvar 0和upvar 1之间的差异
有谁能告诉我TCL中TCL中upvar 0和upvar 1之间的差异,tcl,upvar,Tcl,Upvar,有谁能告诉我TCL中upvar 0和upvar 1之间的区别,我们如何实时使用。如果有人举个例子来解释,我会更清楚。好的,我想举个例子会让区别变得非常清楚: 假设我们有一个功能测试\u upvar1: proc test_upvar1 {} { upvar 1 a b incr b } 和功能测试_upvar0: proc test_upvar0 {} { upvar 0 a b incr b } 现在我们设置变量a并调用这两个函数来查看发生了什么: set
upvar 0
和upvar 1
之间的区别,我们如何实时使用。如果有人举个例子来解释,我会更清楚。好的,我想举个例子会让区别变得非常清楚:
假设我们有一个功能测试\u upvar1:
proc test_upvar1 {} {
upvar 1 a b
incr b
}
和功能测试_upvar0:
proc test_upvar0 {} {
upvar 0 a b
incr b
}
现在我们设置变量a并调用这两个函数来查看发生了什么:
set a 5
test_upvar1
这将返回6
set a 5
test_upvar0
将返回1
发生这种情况的原因是,我们在同一执行帧1中选择0和1执行帧0链接,并将其高出一帧
请参见当您调用一组过程时,会得到一堆堆栈帧。它是以名字命名的。我们可以这样设想: abc 123 456 bcd 321 456 cde 654 321
upvar 0
示例-简化变量名称:
与upvar 1不同,upvar 0为变量创建别名。 例如: 输出:
output is 8 7
in global frame value of a is 7
output is 11 11
in global frame value of a is 4
非常感谢donal,我非常清楚地理解了upvar 1和upvar#0,upvar 0我理解了您的示例,但我无法理解upvar 0的实时使用。根据我的理解,似乎在memberproc作用域上创建了一个变量名var。如果你让我更清楚一点,那就好了。我急切地等待你的评论
proc remember {name contents} {
global my_memory_array
upvar 0 my_memory_array($name) var
if {[info exist var]} {
set var "\"$var $contents\""
} else {
set var "\"$name $contents\""
}
}
remember x 123
remember y 234
remember x 345
remember y 456
parray my_memory_array
# my_memory_array(x) = ""x 123" 345"
# my_memory_array(y) = ""y 234" 456"
set a 4
proc upvar1 {a} {
upvar 1 a b
incr a 4
incr b 3
puts "output is $a $b"
}
proc upvar0 {a} {
upvar 0 a b
incr a 4
incr b 3
puts "output is $a $b"
}
upvar1 $a
puts "in global frame value of a is $a"
set a 4
upvar0 $a
puts "in global frame value of a is $a"
output is 8 7
in global frame value of a is 7
output is 11 11
in global frame value of a is 4