tcl脚本学习十二: upvar的学习

lesson 12 : upvar的学习

example ①

upvar 很象c语言的引用传参,我用一个例子说明
set a 1 ;#定义变量a, 并且值设为1
proc test {b} {
upvar $b mya
puts $b
puts $mya
}
test a ;#调用函数 test
a ;#参数b的值为a(变量名)
1 ;#由于upvar 使mya(变量名)指向a(变量名)指向的同一个变量,mya的为a的值
upvar使的在函数内部可以更改函数外部的变量的值


example ②


proc SetPositive {variable value } {
upvar $variable myvar;
if {$value < 0} { set myvar [expr -$value];} else {set myvar $value;}
return $myvar;
}

SetPositive x $x ;#调用转换函数处理变量 x
SetPositive y $y ;#调用转换函数处理变量 y
puts "X : $x Y: $y "
//可发现 均为5,改变了外部的数值


example ③ :


proc two {y} {
upvar 1 $y z ;# tie the calling value to variable z
upvar 2 x a ;# Tie variable x two levels up to a
puts "two: Z: $z A: $a" ;# Output the values, just to confirm
set z 1; ;# Set z, the passed variable to 1;
set a 2; ;# Set x, two layers up to 2;
}
//evel 有两种表示方式。当 level 为一个整数值时,表示从当前作用域向全局作用域上溯到
level 层作用域。比如 level 为 1 时,代表调用过程作用域,level 为 2 时为上一层作用域
//比如 level 为#0,则
//表示全局作用域,此时的作用同 global 命令。

example ④ :涉及到二级 一级优先级
;# A first level proc - This will be called by the global space code.
proc one {y} {
upvar $y z ;# This ties the calling value to variable z
puts "one: Z: $z" ;# Output that value, to check it is 5
two z; ;# call proc two, which will change the value
}

one y; ;# Call one, and output X and Y after the call.
puts " X: $x Y: $y"

原文地址:https://www.cnblogs.com/gold-life/p/5731146.html