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\n"
//可發現 均為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 "\nX: $x Y: $y"