upvar, pass by name
Tcl proc 參數(shù)是 pass by value 的:
proc printName {employeeName} {
????puts "employeeName = $employeeName"
}
set name "cooper maa"
printName $name
如你所預(yù)期的,上列這段 Script 的輸出是:
employeeName = cooper maa
假若你將 Script 改成這樣,結(jié)果會(huì)是一樣的:
proc printName {varName} {
????# 宣告一個(gè)區(qū)域變數(shù) employeeName,employeeName 變數(shù)是上一層 的某個(gè)變數(shù)的分身
????upvar $varName employeeName
????
????puts "employeeName = $employeeName"
}
set name "cooper maa"
printName name
我們都知道,Tcl 是不必宣告變數(shù)的,要產(chǎn)生新變數(shù),隨時(shí) set 一下就行。upvar 是故意來(lái)「破壞規(guī)矩」的指令,它的目的就是宣告變數(shù)用的!
上列 Script 中:
?upvar $varName employeeName
這行指令是個(gè)倒裝句,它的意思是說(shuō)「在 proc 內(nèi),宣告一個(gè) employeeName 區(qū)域變數(shù),而這個(gè) emplyeeName 變數(shù),其實(shí)是呼叫者那一層某個(gè)變數(shù)的分身」,可是到底 employeeName 是誰(shuí)的分身呢?答案就存在 varName 變數(shù)裏,經(jīng)由呼叫 printName 時(shí)傳遞過(guò)來(lái)的,也就是特別標(biāo)示的那行:
printName name
name (Golobal Scope 的一個(gè)變數(shù))會(huì)傳入 printName 並儲(chǔ)存在 varName 變數(shù)中。所以 $varName 就會(huì)得到 name,那 upvar 指令就可以為 Global Scope 的這個(gè) name 變數(shù)做出一個(gè)分身,就管它叫 employeeName 囉!
相同的事不需要 upvar 也做得到,為什麼要用 upvar 呢?是這樣的,因?yàn)槲覀儧](méi)辦法以 pass by value 的方式傳遞 array,如果要把陣列傳給 proc 處理, 就會(huì)需要用到 upvar 指令。底下是傳遞 array 到 proc 的範(fàn)例:
# 用來(lái)設(shè)定陣列的內(nèi)容
proc setEmployee {varName name age height weight} {
????upvar $varName employee
????
????set employee(name)?? $name
????set employee(age)?? ?$age
????set employee(height) $height
????set employee(weight) $weight
}
# 用來(lái)印出陣列的內(nèi)容
proc printEmployee {varName} {
????upvar $varName employee
????
????puts "Employee info:"
????puts "Name?? = $employee(name)"
????puts "Age??? = $employee(age)"
????puts "Height = $employee(height)"
????puts "Weight = $employee(weight)"
}
# 陣列一開(kāi)始是空的
array set anEmployee {}
# pass by name (anEmployee array)
setEmployee anEmployee coopermaa 28 167 65
printEmployee anEmployee
這段 Script 的輸出為:
Employee info:
Name?? = coopermaa
Age??? = 28
Height = 167
Weight = 65
總結(jié)
以上是生活随笔為你收集整理的upvar, pass by name的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MTK5G平台 MT6885/MT685
- 下一篇: 在.NET中使用正则表达式对太平洋产品参