Provided by:
manpages-zh_1.5.1-1_all 
NAME
upvar - 建立到在不同棧楨上的變量的連接
` SYNOPSIS
upvar ?level? otherVar myVar ?otherVar myVar ...?
_________________________________________________________________
yz DESCRIPTION
這茤R令安排在當前過程中的一茤峖h-
荍蔔ˍ僆q去引用位於包圍它的過程調用中的變量或引用全局變量。 Level
可以用 uplevel 命令允釭漸籉顜峖﹛A並且如果第一 otherVar 的第一-
茼r母不是 # 或一蚍r,則可以被省略(它預設為1)。對於每 otherVar
參數,upvar 使由 level 給出的過程楨中(如果 level 是 #0
則在全局層次)的叫這茼W字的變量在當前過程中可以用由相應的 myVar
參數給出名字來訪問。在調用它的時唹s做 otherVar 的變量不需-
n存在;可以在第一次引用 myVar 時像普通變量那樣建立它。在調用 upvar
的時啎@定不能存在一茈s myVar 的變量。MyVar 總是被作為一-
蚥僆q的名字來對待,而不是一蚍晡漱葛嚏C即使這茼W字看起來像一-
蚍掑葛嚏A比如 a(b),仍建立一茈興W的變量。OtherVar 可以引用一-
蚍迠q變量,或一蚍掑葛嚏CUpvar 返回一茠臟瞗C
upvar 命令簡化了傳名調用(call-by-name)過程的實現並使它易於建立如同 Tcl
過程的新控制結構。例如,考慮下列過程:
proc add2 name {
upvar $name x
set x [expr $x+2]
}
調用 Add2 時加上給出一蚥僆q名字的一荌捊A它向這蚥僆q的[二。儘管 add2
可以使用 uplevel 替代 upvar 來實現,upvar 簡便了 add2
訪問在調用者過程楨中的變量。
namespace eval 是改變 Tcl
命令上下文的另一種方式(除了過程調用之外)。它向棧增加一-
蚑掍庢岳茠磳雃W字空間上下文。這意味著每 namespace eval 命令被視為給
uplevel 和 upvar 命令的另一蚑掍弮h次。例如,info level 1 將返回描z一-
茤R令的列表,它n麼是最外的過程n麼是最外的 namespace eval
命令。還有,uplevel #0 在最外悸漲W字空間(全局名字空間)中的頂層求@-
蚑Z本。
如果刪除(unset)一 upvar 變量(比如,上悸 add2 中的 x ),則 unset |
操作影響它所連接到的變量,而不是 upvar 變量。除了退出在其中定義它的那- |
蚢L程之外,沒有方法刪除一 upvar 變量。但是,可以通過執行另一 upvar |
命令來為一 upvar 變量咿w目標(retarget)。 |
TracesM upvar |
upvar 以一種直接但可能不是預期的方式與 trace 交互。如果在 otherVar |
上定義了一蚥僆q跟蹤,涉及 myVar 的動作將觸發這- |
荌l蹤。但是,傳遞給跟蹤過程將是 myVar 的名字,而不是 otherVar 的名字。 |
所以,下列代碼的輸出將是 localVar 而不是 originalVar: |
proc traceproc { name index op } { |
puts $name |
} |
proc setByUpvar { name value } { |
upvar $name localVar |
set localVar $value |
} |
set originalVar 1 |
trace variable originalVar w traceproc |
setByUpvar originalVar 2 |
} |
如果 otherVar 引用一蚍晡漱葛嚏A則為整蚍梜]置的變量跟蹤在 myVar |
被訪問的時埜N不被調用(但在特定元素上的跟蹤仍將被調用)。特別的,如果這- |
蚍晙O env,則對 myVar 的變動將不被正確的傳遞給子進程。 |
SEE ALSO
global(n), namespace(n), uplevel(n), variable(n)
r KEYWORDS
context, frame, global, level, namespace, procedure, variable
[]
Hhh
[]
2001/11/21
m Linux manUpn:
http://cmpp.linuxforum.net